Skip to content

Commit 1e31ad6

Browse files
committed
fix: reset to v0.6.4 & add skeleton api & lock fix
1 parent e0d7028 commit 1e31ad6

File tree

6 files changed

+87
-2
lines changed

6 files changed

+87
-2
lines changed

internal/dto/backend.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ type FileSkeletonData struct {
225225
Elements []*FileSkeletonElement `json:"elements"`
226226
}
227227

228-
// FileSkeletonImport 导入信息(还原后的原始内容)
228+
// FileSkeletonImport 导入信息
229229
type FileSkeletonImport struct {
230230
Content string `json:"content"` // 原始导入语句
231231
Range []int `json:"range"` // [startLine, startCol, endLine, endCol] - 从1开始

internal/handler/backend.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,3 +318,36 @@ func (h *BackendHandler) ReadCodeSnippets(c *gin.Context) {
318318
}
319319
response.OkJson(c, list)
320320
}
321+
322+
// GetFileSkeleton 获取文件骨架信息
323+
// @Summary 获取文件骨架
324+
// @Description 获取文件的骨架信息,包括导入、包、元素等
325+
// @Tags files
326+
// @Accept json
327+
// @Produce json
328+
// @Param clientId query string true "用户机器ID"
329+
// @Param workspacePath query string true "工作区绝对路径"
330+
// @Param filePath query string true "文件路径"
331+
// @Param filteredBy query string false "过滤类型:definition | reference"
332+
// @Success 200 {object} response.Response{data=dto.FileSkeletonData} "成功"
333+
// @Failure 400 {object} response.Response "请求参数错误"
334+
// @Failure 500 {object} response.Response "服务器内部错误"
335+
// @Router /codebase-indexer/api/v1/files/skeleton [get]
336+
func (h *BackendHandler) GetFileSkeleton(c *gin.Context) {
337+
var req dto.GetFileSkeletonRequest
338+
if err := c.ShouldBindQuery(&req); err != nil {
339+
h.logger.Error("invalid request format: %v", err)
340+
response.Error(c, http.StatusBadRequest, err)
341+
return
342+
}
343+
344+
h.logger.Info("get file skeleton request: ClientId=%s, Workspace=%s, FilePath=%s", req.ClientId, req.WorkspacePath, req.FilePath)
345+
346+
skeleton, err := h.codebaseService.GetFileSkeleton(c, &req)
347+
if err != nil {
348+
h.logger.Error("get file skeleton err: %v", err)
349+
response.Error(c, http.StatusBadRequest, err)
350+
return
351+
}
352+
response.OkJson(c, skeleton)
353+
}

internal/server/backend.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ func SetupBackendRoutes(router *gin.Engine, backendHandler *handler.BackendHandl
1717
api.GET("/search/reference", AuthMiddleware(logger), BackendRateLimitMiddleware(logger), backendHandler.SearchReference)
1818
api.GET("/search/definition", AuthMiddleware(logger), BackendRateLimitMiddleware(logger), backendHandler.SearchDefinition)
1919
api.GET("/files/content", AuthMiddleware(logger), BackendRateLimitMiddleware(logger), backendHandler.GetFileContent)
20+
api.GET("/files/skeleton", AuthMiddleware(logger), BackendRateLimitMiddleware(logger), backendHandler.GetFileSkeleton)
2021
api.POST("/snippets/read", AuthMiddleware(logger), BackendRateLimitMiddleware(logger), backendHandler.ReadCodeSnippets)
2122
api.GET("/codebases/directory", AuthMiddleware(logger), BackendRateLimitMiddleware(logger), backendHandler.GetCodebaseDirectory)
2223
api.GET("/files/structure", AuthMiddleware(logger), BackendRateLimitMiddleware(logger), backendHandler.GetFileStructure)

internal/service/codebase.go

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,9 @@ type CodebaseService interface {
6464
DeleteIndex(ctx context.Context, req *dto.DeleteIndexRequest) error
6565
ExportIndex(c *gin.Context, d *dto.ExportIndexRequest) error
6666
ReadCodeSnippets(c *gin.Context, d *dto.ReadCodeSnippetsRequest) (*dto.CodeSnippetsData, error)
67+
68+
// GetFileSkeleton 获取文件骨架信息
69+
GetFileSkeleton(ctx context.Context, req *dto.GetFileSkeletonRequest) (*dto.FileSkeletonData, error)
6770
}
6871

6972
const maxReadLine = 5000
@@ -683,13 +686,49 @@ func convertStatus(status int) string {
683686
return indexStatus
684687
}
685688

689+
func (s *codebaseService) GetFileSkeleton(ctx context.Context, req *dto.GetFileSkeletonRequest) (*dto.FileSkeletonData, error) {
690+
// 1. 参数校验
691+
if req.WorkspacePath == "" || req.FilePath == "" {
692+
return nil, errs.NewMissingParamError("workspacePath or filePath")
693+
}
694+
695+
// 2. 路径处理(相对/绝对)
696+
filePath := req.FilePath
697+
if !filepath.IsAbs(filePath) {
698+
filePath = filepath.Join(req.WorkspacePath, filePath)
699+
}
700+
701+
// 验证路径是否在 workspace 内
702+
if err := s.checkPath(ctx, req.WorkspacePath, []string{filePath}); err != nil {
703+
return nil, err
704+
}
705+
706+
// 3. 获取原始 FileElementTable
707+
table, err := s.indexer.GetFileElementTable(ctx, req.WorkspacePath, filePath)
708+
if err != nil {
709+
return nil, fmt.Errorf("failed to get file element table: %w", err)
710+
}
711+
712+
// 4. 读取文件内容(用于提取签名和还原imports)
713+
fileContent, err := s.workspaceReader.ReadFile(ctx, filePath, types.ReadOptions{})
714+
if err != nil {
715+
s.logger.Warn("failed to read file content for %s: %v", filePath, err)
716+
fileContent = nil // 继续处理,但签名和imports还原会失败
717+
}
718+
719+
// 5. 转换数据结构
720+
result := convertToFileSkeletonData(table, fileContent, req.FilteredBy)
721+
722+
return result, nil
723+
}
724+
686725
// convertToFileSkeletonData 转换 FileElementTable 到 FileSkeletonData
687726
func convertToFileSkeletonData(
688727
table *codegraphpb.FileElementTable,
689728
fileContent []byte,
690729
filteredBy string,
691730
) *dto.FileSkeletonData {
692-
// 按行分割文件内容(KISS原则)
731+
// 按行分割文件内容
693732
var lines []string
694733
if fileContent != nil {
695734
lines = strings.Split(string(fileContent), "\n")

internal/service/indexer.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,9 @@ type Indexer interface {
7171

7272
// IndexIter 获取索引迭代器
7373
IndexIter(ctx context.Context, projectUuid string) store.Iterator
74+
75+
// GetFileElementTable 获取文件元素表
76+
GetFileElementTable(ctx context.Context, workspacePath string, filePath string) (*codegraphpb.FileElementTable, error)
7477
}
7578

7679
// indexer 代码索引器
@@ -2237,6 +2240,15 @@ func (i *indexer) RenameIndexes(ctx context.Context, workspacePath string, sourc
22372240
return nil
22382241
}
22392242

2243+
// GetFileElementTable 通过工作区路径和文件路径获取FileElementTable(公开方法)
2244+
func (i *indexer) GetFileElementTable(ctx context.Context, workspacePath string, filePath string) (*codegraphpb.FileElementTable, error) {
2245+
project, err := i.GetProjectByFilePath(ctx, workspacePath, filePath)
2246+
if err != nil {
2247+
return nil, err
2248+
}
2249+
return i.getFileElementTableByPath(ctx, project.Uuid, filePath)
2250+
}
2251+
22402252
// getFileElementTableByPath 通过路径获取FileElementTable
22412253
func (i *indexer) getFileElementTableByPath(ctx context.Context, projectUuid string, filePath string) (*codegraphpb.FileElementTable, error) {
22422254
language, err := lang.InferLanguage(filePath)

output.txt

17.4 KB
Binary file not shown.

0 commit comments

Comments
 (0)