files responses

This commit is contained in:
m
2026-07-13 16:35:01 +02:00
parent 968605b3d1
commit 3c66fcabfc
9 changed files with 121 additions and 58 deletions
+51 -5
View File
@@ -14,7 +14,7 @@ import (
const createFile = `-- name: CreateFile :one const createFile = `-- name: CreateFile :one
INSERT INTO files (id, name, mime_type, size, storage_key, checksum, created_at, updated_at) INSERT INTO files (id, name, mime_type, size, storage_key, checksum, created_at, updated_at)
VALUES ($1, $2, $3, $4, $5, $6, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP) VALUES ($1, $2, $3, $4, $5, $6, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
RETURNING id, name, mime_type, size, storage_key, checksum, ocr_text, created_at, updated_at, is_folder RETURNING id, name, mime_type, size, storage_key, checksum, ocr_text, created_at, updated_at, is_folder, parent_file_id
` `
type CreateFileParams struct { type CreateFileParams struct {
@@ -47,6 +47,7 @@ func (q *Queries) CreateFile(ctx context.Context, arg CreateFileParams) (File, e
&i.CreatedAt, &i.CreatedAt,
&i.UpdatedAt, &i.UpdatedAt,
&i.IsFolder, &i.IsFolder,
&i.ParentFileID,
) )
return i, err return i, err
} }
@@ -54,7 +55,7 @@ func (q *Queries) CreateFile(ctx context.Context, arg CreateFileParams) (File, e
const createFolder = `-- name: CreateFolder :one const createFolder = `-- name: CreateFolder :one
INSERT INTO files (id, name, created_at, updated_at) INSERT INTO files (id, name, created_at, updated_at)
VALUES ($1, $2, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP) VALUES ($1, $2, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
RETURNING id, name, mime_type, size, storage_key, checksum, ocr_text, created_at, updated_at, is_folder RETURNING id, name, mime_type, size, storage_key, checksum, ocr_text, created_at, updated_at, is_folder, parent_file_id
` `
type CreateFolderParams struct { type CreateFolderParams struct {
@@ -76,6 +77,7 @@ func (q *Queries) CreateFolder(ctx context.Context, arg CreateFolderParams) (Fil
&i.CreatedAt, &i.CreatedAt,
&i.UpdatedAt, &i.UpdatedAt,
&i.IsFolder, &i.IsFolder,
&i.ParentFileID,
) )
return i, err return i, err
} }
@@ -91,7 +93,7 @@ func (q *Queries) DeleteFile(ctx context.Context, id string) error {
} }
const getFile = `-- name: GetFile :one const getFile = `-- name: GetFile :one
SELECT id, name, mime_type, size, storage_key, checksum, ocr_text, created_at, updated_at, is_folder FROM files SELECT id, name, mime_type, size, storage_key, checksum, ocr_text, created_at, updated_at, is_folder, parent_file_id FROM files
WHERE id = $1 LIMIT 1 WHERE id = $1 LIMIT 1
` `
@@ -109,12 +111,13 @@ func (q *Queries) GetFile(ctx context.Context, id string) (File, error) {
&i.CreatedAt, &i.CreatedAt,
&i.UpdatedAt, &i.UpdatedAt,
&i.IsFolder, &i.IsFolder,
&i.ParentFileID,
) )
return i, err return i, err
} }
const listFiles = `-- name: ListFiles :many const listFiles = `-- name: ListFiles :many
SELECT id, name, mime_type, size, storage_key, checksum, ocr_text, created_at, updated_at, is_folder FROM files SELECT id, name, mime_type, size, storage_key, checksum, ocr_text, created_at, updated_at, is_folder, parent_file_id FROM files
ORDER BY created_at DESC ORDER BY created_at DESC
` `
@@ -138,6 +141,7 @@ func (q *Queries) ListFiles(ctx context.Context) ([]File, error) {
&i.CreatedAt, &i.CreatedAt,
&i.UpdatedAt, &i.UpdatedAt,
&i.IsFolder, &i.IsFolder,
&i.ParentFileID,
); err != nil { ); err != nil {
return nil, err return nil, err
} }
@@ -153,7 +157,7 @@ func (q *Queries) ListFiles(ctx context.Context) ([]File, error) {
} }
const listFilesByID = `-- name: ListFilesByID :many const listFilesByID = `-- name: ListFilesByID :many
SELECT id, name, mime_type, size, storage_key, checksum, ocr_text, created_at, updated_at, is_folder FROM files SELECT id, name, mime_type, size, storage_key, checksum, ocr_text, created_at, updated_at, is_folder, parent_file_id FROM files
WHERE id = ANY($1::text[]) WHERE id = ANY($1::text[])
ORDER BY created_at DESC ORDER BY created_at DESC
` `
@@ -178,6 +182,48 @@ func (q *Queries) ListFilesByID(ctx context.Context, dollar_1 []string) ([]File,
&i.CreatedAt, &i.CreatedAt,
&i.UpdatedAt, &i.UpdatedAt,
&i.IsFolder, &i.IsFolder,
&i.ParentFileID,
); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Close(); err != nil {
return nil, err
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const listFolders = `-- name: ListFolders :many
SELECT id, name, mime_type, size, storage_key, checksum, ocr_text, created_at, updated_at, is_folder, parent_file_id FROM files
WHERE is_folder = true
ORDER BY created_at DESC
`
func (q *Queries) ListFolders(ctx context.Context) ([]File, error) {
rows, err := q.db.QueryContext(ctx, listFolders)
if err != nil {
return nil, err
}
defer rows.Close()
var items []File
for rows.Next() {
var i File
if err := rows.Scan(
&i.ID,
&i.Name,
&i.MimeType,
&i.Size,
&i.StorageKey,
&i.Checksum,
&i.OcrText,
&i.CreatedAt,
&i.UpdatedAt,
&i.IsFolder,
&i.ParentFileID,
); err != nil { ); err != nil {
return nil, err return nil, err
} }
@@ -0,0 +1,3 @@
ALTER TABLE files DROP CONSTRAINT IF EXISTS fk_parent_file_id
ALTER TABLE files DROP COLUMN IF EXISTS parent_file_id;
@@ -0,0 +1,3 @@
ALTER TABLE files ADD COLUMN parent_file_id TEXT;
ALTER TABLE files ADD CONSTRAINT fk_parent_file_id FOREIGN KEY(parent_file_id) REFERENCES files(id)
+11 -10
View File
@@ -10,16 +10,17 @@ import (
) )
type File struct { type File struct {
ID string `json:"id"` ID string `json:"id"`
Name string `json:"name"` Name string `json:"name"`
MimeType string `json:"mime_type"` MimeType string `json:"mime_type"`
Size int64 `json:"size"` Size int64 `json:"size"`
StorageKey string `json:"storage_key"` StorageKey string `json:"storage_key"`
Checksum string `json:"checksum"` Checksum string `json:"checksum"`
OcrText string `json:"ocr_text"` OcrText string `json:"ocr_text"`
CreatedAt time.Time `json:"created_at"` CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"` UpdatedAt time.Time `json:"updated_at"`
IsFolder bool `json:"is_folder"` IsFolder bool `json:"is_folder"`
ParentFileID sql.NullString `json:"parent_file_id"`
} }
type FileTag struct { type FileTag struct {
+5
View File
@@ -6,6 +6,11 @@ WHERE id = $1 LIMIT 1;
SELECT * FROM files SELECT * FROM files
ORDER BY created_at DESC; ORDER BY created_at DESC;
-- name: ListFolders :many
SELECT * FROM files
WHERE is_folder = true
ORDER BY created_at DESC;
-- name: ListFilesByID :many -- name: ListFilesByID :many
SELECT * FROM files SELECT * FROM files
WHERE id = ANY($1::text[]) WHERE id = ANY($1::text[])
+2 -1
View File
@@ -64,7 +64,7 @@ func (q *Queries) DeleteTag(ctx context.Context, id string) error {
} }
const getFilesByTagID = `-- name: GetFilesByTagID :many const getFilesByTagID = `-- name: GetFilesByTagID :many
SELECT f.id, f.name, f.mime_type, f.size, f.storage_key, f.checksum, f.ocr_text, f.created_at, f.updated_at, f.is_folder FROM files f SELECT f.id, f.name, f.mime_type, f.size, f.storage_key, f.checksum, f.ocr_text, f.created_at, f.updated_at, f.is_folder, f.parent_file_id FROM files f
JOIN file_tags ft ON f.id = ft.file_id JOIN file_tags ft ON f.id = ft.file_id
WHERE ft.tag_id = $1 WHERE ft.tag_id = $1
ORDER BY f.created_at DESC ORDER BY f.created_at DESC
@@ -90,6 +90,7 @@ func (q *Queries) GetFilesByTagID(ctx context.Context, tagID sql.NullString) ([]
&i.CreatedAt, &i.CreatedAt,
&i.UpdatedAt, &i.UpdatedAt,
&i.IsFolder, &i.IsFolder,
&i.ParentFileID,
); err != nil { ); err != nil {
return nil, err return nil, err
} }
+20 -19
View File
@@ -64,15 +64,16 @@ func (h *FileHandler) List(c *gin.Context) {
} }
type fileResponse struct { type fileResponse struct {
ID string `json:"id"` ID string `json:"id"`
URL string `json:"url"` URL string `json:"url"`
Name string `json:"name"` Name string `json:"name"`
Size int64 `json:"size"` Size int64 `json:"size"`
Tags []tagResponse `json:"tags"` Tags []tagResponse `json:"tags"`
CreatedAt string `json:"createdAt"` CreatedAt string `json:"createdAt"`
MimeType string `json:"mimeType"` MimeType string `json:"mimeType"`
OcrText string `json:"ocrText,omitempty"` OcrText string `json:"ocrText,omitempty"`
UpdatedAt string `json:"updatedAt"` ParentFileID string `json:"parentFileID,omitempty"`
UpdatedAt string `json:"updatedAt"`
} }
resp := make([]fileResponse, len(files)) resp := make([]fileResponse, len(files))
@@ -89,17 +90,17 @@ func (h *FileHandler) List(c *gin.Context) {
}) })
} }
resp[i] = fileResponse{ resp[i] = fileResponse{
ID: f.ID, ID: f.ID,
URL: h.urls.GenerateDownloadURL(f.ID), URL: h.urls.GenerateDownloadURL(f.ID),
Name: f.Name, Name: f.Name,
Size: f.Size, Size: f.Size,
Tags: tags, Tags: tags,
CreatedAt: f.CreatedAt, CreatedAt: f.CreatedAt,
OcrText: f.OcrText, ParentFileID: f.ParentFileID,
UpdatedAt: f.UpdatedAt, OcrText: f.OcrText,
MimeType: f.MimeType, UpdatedAt: f.UpdatedAt,
MimeType: f.MimeType,
} }
} }
+14 -13
View File
@@ -1,22 +1,23 @@
package model package model
type Tag struct { type Tag struct {
ID string `json:"id"` ID string `json:"id"`
Name string `json:"name"` Name string `json:"name"`
TagType string `json:"tagType"` TagType string `json:"tagType"`
} }
type File struct { type File struct {
ID string `json:"id"` ID string `json:"id"`
Name string `json:"name"` Name string `json:"name"`
MimeType string `json:"mimeType"` MimeType string `json:"mimeType"`
Size int64 `json:"size"` Size int64 `json:"size"`
StorageKey string `json:"-"` StorageKey string `json:"-"`
Checksum string `json:"-"` Checksum string `json:"-"`
OcrText string `json:"ocrText,omitempty"` OcrText string `json:"ocrText,omitempty"`
Tags []Tag `json:"tags"` Tags []Tag `json:"tags"`
CreatedAt string `json:"createdAt"` CreatedAt string `json:"createdAt"`
UpdatedAt string `json:"updatedAt"` UpdatedAt string `json:"updatedAt"`
ParentFileID string `json:"parentFileID,omitempty"`
} }
type UploadResult struct { type UploadResult struct {
+12 -10
View File
@@ -167,17 +167,19 @@ func dbToModel(f db.File, dbTags []db.Tag) model.File {
for i, t := range dbTags { for i, t := range dbTags {
tags[i] = model.Tag{ID: t.ID, Name: t.TagName, TagType: t.TagType} tags[i] = model.Tag{ID: t.ID, Name: t.TagName, TagType: t.TagType}
} }
return model.File{ return model.File{
ID: f.ID, ID: f.ID,
Name: f.Name, Name: f.Name,
MimeType: f.MimeType, MimeType: f.MimeType,
Size: f.Size, Size: f.Size,
StorageKey: f.StorageKey, StorageKey: f.StorageKey,
Checksum: f.Checksum, Checksum: f.Checksum,
OcrText: f.OcrText, OcrText: f.OcrText,
Tags: tags, ParentFileID: f.ParentFileID.String,
CreatedAt: f.CreatedAt.String(), Tags: tags,
UpdatedAt: f.UpdatedAt.String(), CreatedAt: f.CreatedAt.String(),
UpdatedAt: f.UpdatedAt.String(),
} }
} }