diff --git a/frontend/src/network/models.ts b/frontend/src/network/models.ts index 75486af..78a6d1f 100644 --- a/frontend/src/network/models.ts +++ b/frontend/src/network/models.ts @@ -197,5 +197,6 @@ export interface Collection { title: string; article: string; user: User; + resources_count: number; images: Image[]; -} \ No newline at end of file +} diff --git a/server/dao/collection.go b/server/dao/collection.go index 087c50c..d88ef29 100644 --- a/server/dao/collection.go +++ b/server/dao/collection.go @@ -80,7 +80,11 @@ func AddResourceToCollection(collectionID uint, resourceID uint) error { collection := &model.Collection{} if err := tx.Where("id = ?", collectionID).First(collection).Error; err != nil { - return err + return model.NewRequestError("Invalid collection ID") + } + + if err := tx.Model(&model.Resource{}).Where("id = ?", resourceID).First(&model.Resource{}).Error; err != nil { + return model.NewRequestError("Invalid resource ID") } if err := tx.Model(collection).Association("Resources").Append(&model.Resource{ @@ -91,6 +95,10 @@ func AddResourceToCollection(collectionID uint, resourceID uint) error { return err } + if err := tx.Model(collection).UpdateColumn("resources_count", gorm.Expr("resources_count + ?", 1)).Error; err != nil { + return err + } + return nil }) } @@ -100,7 +108,11 @@ func RemoveResourceFromCollection(collectionID uint, resourceID uint) error { collection := &model.Collection{} if err := tx.Where("id = ?", collectionID).First(collection).Error; err != nil { - return err + return model.NewRequestError("Invalid collection ID") + } + + if err := tx.Model(&model.Resource{}).Where("id = ?", resourceID).First(&model.Resource{}).Error; err != nil { + return model.NewRequestError("Invalid resource ID") } if err := tx.Model(collection).Association("Resources").Delete(&model.Resource{ @@ -111,6 +123,10 @@ func RemoveResourceFromCollection(collectionID uint, resourceID uint) error { return err } + if err := tx.Model(collection).UpdateColumn("resources_count", gorm.Expr("resources_count - ?", 1)).Error; err != nil { + return err + } + return nil }) } diff --git a/server/model/collection.go b/server/model/collection.go index 549c5c6..f962500 100644 --- a/server/model/collection.go +++ b/server/model/collection.go @@ -4,28 +4,31 @@ import "gorm.io/gorm" type Collection struct { gorm.Model - Title string `gorm:"not null"` - Article string `gorm:"not null"` - UserID uint `gorm:"not null"` - User User `gorm:"foreignKey:UserID;references:ID"` - Images []Image `gorm:"many2many:collection_images;"` - Resources []Resource `gorm:"many2many:collection_resources;"` + Title string `gorm:"not null"` + Article string `gorm:"not null"` + UserID uint `gorm:"not null"` + User User `gorm:"foreignKey:UserID;references:ID"` + ResourcesCount int `gorm:"default:0"` + Images []Image `gorm:"many2many:collection_images;"` + Resources []Resource `gorm:"many2many:collection_resources;"` } type CollectionView struct { - ID uint `json:"id"` - Title string `json:"title"` - Article string `json:"article"` - User UserView `json:"user"` - Images []Image `json:"images"` + ID uint `json:"id"` + Title string `json:"title"` + Article string `json:"article"` + User UserView `json:"user"` + ResourcesCount int `json:"resources_count"` + Images []Image `json:"images"` } func (c Collection) ToView() *CollectionView { return &CollectionView{ - ID: c.ID, - Title: c.Title, - Article: c.Article, - User: c.User.ToView(), - Images: c.Images, + ID: c.ID, + Title: c.Title, + Article: c.Article, + User: c.User.ToView(), + ResourcesCount: c.ResourcesCount, + Images: c.Images, } }