Skip to content

Commit

Permalink
Merge pull request stakwork#2495 from aliraza556/feature/file-asset-m…
Browse files Browse the repository at this point in the history
…anagement

Feature: File Asset Management System with Meme Server Integration
  • Loading branch information
humansinstitute authored Jan 27, 2025
2 parents 3063153 + 865f6fd commit 9760986
Show file tree
Hide file tree
Showing 9 changed files with 1,554 additions and 1 deletion.
115 changes: 115 additions & 0 deletions db/chat.go
Original file line number Diff line number Diff line change
Expand Up @@ -159,3 +159,118 @@ func (db database) GetAllChatsForWorkspace(workspaceID string) ([]Chat, error) {
}
return chats, nil
}

func (db database) CreateFileAsset(asset *FileAsset) (*FileAsset, error) {
now := time.Now()
asset.CreatedAt = now
asset.UpdatedAt = now
asset.UploadTime = now
asset.LastReferenced = now

if err := db.db.Create(asset).Error; err != nil {
return nil, fmt.Errorf("failed to create file asset: %w", err)
}
return asset, nil
}

func (db database) GetFileAssetByHash(fileHash string) (*FileAsset, error) {
var asset FileAsset
if err := db.db.Where("file_hash = ? AND status != ?", fileHash, DeletedFileStatus).First(&asset).Error; err != nil {
return nil, err
}
return &asset, nil
}

func (db database) GetFileAssetByID(id uint) (*FileAsset, error) {
var asset FileAsset
if err := db.db.First(&asset, id).Error; err != nil {
return nil, err
}
return &asset, nil
}

func (db database) UpdateFileAssetReference(id uint) error {
result := db.db.Model(&FileAsset{}).
Where("id = ?", id).
Updates(map[string]interface{}{
"last_referenced": time.Now(),
"status": ActiveFileStatus,
})

if result.Error != nil {
return result.Error
}
if result.RowsAffected == 0 {
return fmt.Errorf("no file asset found with id %d", id)
}
return nil
}

func (db database) ListFileAssets(params ListFileAssetsParams) ([]FileAsset, int64, error) {
var assets []FileAsset
var total int64

query := db.db.Model(&FileAsset{})

if params.Status != nil {
query = query.Where("status = ?", *params.Status)
}
if params.MimeType != nil {
query = query.Where("mime_type = ?", *params.MimeType)
}
if params.BeforeDate != nil {
query = query.Where("upload_time <= ?", *params.BeforeDate)
}
if params.AfterDate != nil {
query = query.Where("upload_time >= ?", *params.AfterDate)
}
if params.LastAccessedBefore != nil {
query = query.Where("last_referenced <= ?", *params.LastAccessedBefore)
}
if params.WorkspaceID != nil {
query = query.Where("workspace_id = ?", *params.WorkspaceID)
}

if err := query.Count(&total).Error; err != nil {
return nil, 0, err
}

offset := (params.Page - 1) * params.PageSize
if err := query.Offset(offset).
Limit(params.PageSize).
Order("upload_time DESC").
Find(&assets).Error; err != nil {
return nil, 0, err
}

return assets, total, nil
}

func (db database) UpdateFileAsset(asset *FileAsset) error {
asset.UpdatedAt = time.Now()
return db.db.Save(asset).Error
}

func (db database) DeleteFileAsset(id uint) error {

var asset FileAsset
if err := db.db.First(&asset, id).Error; err != nil {
return fmt.Errorf("file not found: %w", err)
}

now := time.Now()
result := db.db.Model(&FileAsset{}).
Where("id = ?", id).
Updates(map[string]interface{}{
"status": DeletedFileStatus,
"deleted_at": &now,
})

if result.Error != nil {
return result.Error
}
if result.RowsAffected == 0 {
return fmt.Errorf("no file asset found with id %d", id)
}
return nil
}
2 changes: 1 addition & 1 deletion db/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ func InitDB() {
db.AutoMigrate(&Notification{})
db.AutoMigrate(&TextSnippet{})
db.AutoMigrate(&BountyTiming{})

db.AutoMigrate(&FileAsset{})

DB.MigrateTablesWithOrgUuid()
DB.MigrateOrganizationToWorkspace()
Expand Down
7 changes: 7 additions & 0 deletions db/interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -272,4 +272,11 @@ type Database interface {
GetSnippetByID(id uint) (*TextSnippet, error)
UpdateSnippet(snippet *TextSnippet) (*TextSnippet, error)
DeleteSnippet(id uint) error
CreateFileAsset(asset *FileAsset) (*FileAsset, error)
GetFileAssetByHash(fileHash string) (*FileAsset, error)
GetFileAssetByID(id uint) (*FileAsset, error)
UpdateFileAssetReference(id uint) error
ListFileAssets(params ListFileAssetsParams) ([]FileAsset, int64, error)
UpdateFileAsset(asset *FileAsset) error
DeleteFileAsset(id uint) error
}
37 changes: 37 additions & 0 deletions db/structs.go
Original file line number Diff line number Diff line change
Expand Up @@ -1215,6 +1215,43 @@ type TextSnippet struct {
LastEdited time.Time `json:"last_edited" gorm:"autoUpdateTime"`
}

type FileStatus string

const (
ActiveFileStatus FileStatus = "active"
ArchivedFileStatus FileStatus = "archived"
DeletedFileStatus FileStatus = "deleted"
)

type FileAsset struct {
ID uint `json:"id" gorm:"primaryKey;autoIncrement"`
OriginFilename string `json:"originFilename"`
FileHash string `json:"fileHash" gorm:"index"`
UploadFilename string `json:"uploadFilename" gorm:"uniqueIndex"`
UploadTime time.Time `json:"uploadTime"`
LastReferenced time.Time `json:"lastReferenced"`
FileSize int64 `json:"fileSize"`
MimeType string `json:"mimeType"`
Status FileStatus `json:"status" gorm:"type:varchar(20);default:'active'"`
UploadedBy string `json:"uploadedBy"`
StoragePath string `json:"storagePath"`
WorkspaceID string `json:"workspaceId" gorm:"index"`
CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"`
DeletedAt *time.Time `json:"deletedAt,omitempty" gorm:"index"`
}

type ListFileAssetsParams struct {
Status *FileStatus `form:"status"`
MimeType *string `form:"mimeType"`
BeforeDate *time.Time `form:"beforeDate"`
AfterDate *time.Time `form:"afterDate"`
LastAccessedBefore *time.Time `form:"lastAccessedBefore"`
WorkspaceID *string `form:"workspaceId"`
Page int `form:"page,default=1"`
PageSize int `form:"pageSize,default=50"`
}

func (Person) TableName() string {
return "people"
}
Expand Down
3 changes: 3 additions & 0 deletions db/test_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ func InitTestDB() {
db.AutoMigrate(&Notification{})
db.AutoMigrate(&BountyTiming{})
db.AutoMigrate(&TextSnippet{})
db.AutoMigrate(&FileAsset{})

people := TestDB.GetAllPeople()
for _, p := range people {
Expand Down Expand Up @@ -118,6 +119,8 @@ func CleanTestData() {
TestDB.db.Exec("DELETE FROM feature_stories")

TestDB.db.Exec("DELETE FROM text_snippets")

TestDB.db.Exec("DELETE FROM file_assets")
}

func DeleteAllChatMessages() {
Expand Down
Loading

0 comments on commit 9760986

Please sign in to comment.