files responses
This commit is contained in:
@@ -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)
|
||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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[])
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user