diff --git a/models/group.go b/models/group.go index 756fcb0..c8cc920 100644 --- a/models/group.go +++ b/models/group.go @@ -24,19 +24,21 @@ type Group struct { // GroupOption 用户组其他配置 type GroupOption struct { - ArchiveDownload bool `json:"archive_download,omitempty"` // 打包下载 - ArchiveTask bool `json:"archive_task,omitempty"` // 在线压缩 - CompressSize uint64 `json:"compress_size,omitempty"` // 可压缩大小 - DecompressSize uint64 `json:"decompress_size,omitempty"` - OneTimeDownload bool `json:"one_time_download,omitempty"` - ShareDownload bool `json:"share_download,omitempty"` - Aria2 bool `json:"aria2,omitempty"` // 离线下载 - Aria2Options map[string]interface{} `json:"aria2_options,omitempty"` // 离线下载用户组配置 - SourceBatchSize int `json:"source_batch,omitempty"` - RedirectedSource bool `json:"redirected_source,omitempty"` - Aria2BatchSize int `json:"aria2_batch,omitempty"` - AdvanceDelete bool `json:"advance_delete,omitempty"` - WebDAVProxy bool `json:"webdav_proxy,omitempty"` + ArchiveDownload bool `json:"archive_download,omitempty"` // 打包下载 + ArchiveTask bool `json:"archive_task,omitempty"` // 在线压缩 + CompressSize uint64 `json:"compress_size,omitempty"` // 可压缩大小 + DecompressSize uint64 `json:"decompress_size,omitempty"` + OneTimeDownload bool `json:"one_time_download,omitempty"` + ShareDownload bool `json:"share_download,omitempty"` + Aria2 bool `json:"aria2,omitempty"` // 离线下载 + Aria2Options map[string]interface{} `json:"aria2_options,omitempty"` // 离线下载用户组配置 + SourceBatchSize int `json:"source_batch,omitempty"` + RedirectedSource bool `json:"redirected_source,omitempty"` + Aria2BatchSize int `json:"aria2_batch,omitempty"` + AdvanceDelete bool `json:"advance_delete,omitempty"` + WebDAVProxy bool `json:"webdav_proxy,omitempty"` + GroupFolderEnabled bool `json:"group_folder_enabled,omitempty"` + GroupFolder string `json:"group_folder,omitempty"` } // GetGroupByID 用ID获取用户组 @@ -70,6 +72,21 @@ func (group *Group) BeforeSave() (err error) { return err } +func (group *Group) AfterSave() (err error) { + err = json.Unmarshal([]byte(group.Options), &group.OptionsSerialized) + if err != nil { + return err + } + + if group.OptionsSerialized.GroupFolderEnabled { + err = group.createGroupFolder(group.OptionsSerialized.GroupFolder) + } else { + err = group.deleteGroupFolder() + } + + return err +} + // SerializePolicyList 将序列后的可选策略列表、配置写入数据库字段 // TODO 完善测试 func (group *Group) SerializePolicyList() (err error) { @@ -89,3 +106,41 @@ func (group *Group) getGroupFolder() (*Folder, bool) { result := DB.Where("owner_id = ?", -int(group.ID)).First(&folder) return &folder, !result.RecordNotFound() } + +// createGroupFolder 创建用户组文件夹,如果已存在则更新 +func (group *Group) createGroupFolder(name string) error { + tx := DB.Begin() + folder, ok := group.getGroupFolder() + if !ok { + folder = &Folder{ + OwnerID: -int(group.ID), + Name: name, + } + if err := tx.Create(folder).Error; err != nil { + return err + } + } else { + folder.Name = name + if err := tx.Save(folder).Error; err != nil { + return err + } + } + + group.GroupFolder = folder + return tx.Commit().Error +} + +// deleteGroupFolder 删除用户组文件夹 +func (group *Group) deleteGroupFolder() error { + tx := DB.Begin() + var folder Folder + if err := tx.Where("owner_id = ?", -int(group.ID)).First(&folder).Error; err != nil { + return err + } + + if err := tx.Delete(&folder).Error; err != nil { + return err + } + + return tx.Commit().Error +}