Files
hpc/internal/store/file_store.go

109 lines
2.7 KiB
Go

package store
import (
"context"
"errors"
"gcy_hpc_server/internal/model"
"gorm.io/gorm"
)
type FileStore struct {
db *gorm.DB
}
func NewFileStore(db *gorm.DB) *FileStore {
return &FileStore{db: db}
}
func (s *FileStore) Create(ctx context.Context, file *model.File) error {
return s.db.WithContext(ctx).Create(file).Error
}
func (s *FileStore) GetByID(ctx context.Context, id int64) (*model.File, error) {
var file model.File
err := s.db.WithContext(ctx).First(&file, id).Error
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, nil
}
if err != nil {
return nil, err
}
return &file, nil
}
func (s *FileStore) List(ctx context.Context, folderID *int64, page, pageSize int) ([]model.File, int64, error) {
query := s.db.WithContext(ctx).Model(&model.File{})
if folderID == nil {
query = query.Where("folder_id IS NULL")
} else {
query = query.Where("folder_id = ?", *folderID)
}
var total int64
if err := query.Count(&total).Error; err != nil {
return nil, 0, err
}
var files []model.File
offset := (page - 1) * pageSize
if err := query.Order("id DESC").Limit(pageSize).Offset(offset).Find(&files).Error; err != nil {
return nil, 0, err
}
return files, total, nil
}
func (s *FileStore) Search(ctx context.Context, queryStr string, page, pageSize int) ([]model.File, int64, error) {
query := s.db.WithContext(ctx).Model(&model.File{}).Where("name LIKE ?", "%"+queryStr+"%")
var total int64
if err := query.Count(&total).Error; err != nil {
return nil, 0, err
}
var files []model.File
offset := (page - 1) * pageSize
if err := query.Order("id DESC").Limit(pageSize).Offset(offset).Find(&files).Error; err != nil {
return nil, 0, err
}
return files, total, nil
}
func (s *FileStore) Delete(ctx context.Context, id int64) error {
result := s.db.WithContext(ctx).Delete(&model.File{}, id)
if result.Error != nil {
return result.Error
}
return nil
}
func (s *FileStore) CountByBlobSHA256(ctx context.Context, blobSHA256 string) (int64, error) {
var count int64
err := s.db.WithContext(ctx).Model(&model.File{}).
Where("blob_sha256 = ?", blobSHA256).
Count(&count).Error
return count, err
}
func (s *FileStore) GetByIDs(ctx context.Context, ids []int64) ([]model.File, error) {
var files []model.File
if len(ids) == 0 {
return files, nil
}
err := s.db.WithContext(ctx).Where("id IN ?", ids).Find(&files).Error
return files, err
}
func (s *FileStore) GetBlobSHA256ByID(ctx context.Context, id int64) (string, error) {
var file model.File
err := s.db.WithContext(ctx).Select("blob_sha256").First(&file, id).Error
if errors.Is(err, gorm.ErrRecordNotFound) {
return "", nil
}
if err != nil {
return "", err
}
return file.BlobSHA256, nil
}