package biz import ( "context" "encoding/json" "errors" "time" ) type Announcement struct { ID uint CreatedAt time.Time UpdatedAt time.Time Title string Content string UserID *uint Attachments json.RawMessage } type AnnouncementFilter struct { Page, PageSize int StartCreatedAt, EndCreatedAt *time.Time } type AnnouncementRepo interface { Create(context.Context, *Announcement) error Delete(context.Context, uint) error DeleteByIDs(context.Context, []uint) error Update(context.Context, *Announcement) error Find(context.Context, uint) (*Announcement, error) List(context.Context, AnnouncementFilter) ([]*Announcement, int64, error) UserOptions(context.Context) ([]UserOption, error) } type UserOption struct { Label string Value uint } type AnnouncementUsecase struct{ repo AnnouncementRepo } func NewAnnouncementUsecase(repo AnnouncementRepo) *AnnouncementUsecase { return &AnnouncementUsecase{repo: repo} } func validateAnnouncement(item *Announcement) error { if item == nil || item.Title == "" { return errors.New("公告标题不能为空") } if len(item.Attachments) == 0 || !json.Valid(item.Attachments) { item.Attachments = json.RawMessage("[]") } return nil } func (uc *AnnouncementUsecase) Create(ctx context.Context, item *Announcement) error { if err := validateAnnouncement(item); err != nil { return err } return uc.repo.Create(ctx, item) } func (uc *AnnouncementUsecase) Update(ctx context.Context, item *Announcement) error { if item == nil || item.ID == 0 { return errors.New("公告ID不能为空") } if err := validateAnnouncement(item); err != nil { return err } return uc.repo.Update(ctx, item) } func (uc *AnnouncementUsecase) Delete(ctx context.Context, id uint) error { if id == 0 { return errors.New("公告ID不能为空") } return uc.repo.Delete(ctx, id) } func (uc *AnnouncementUsecase) DeleteByIDs(ctx context.Context, ids []uint) error { if len(ids) == 0 { return errors.New("公告ID不能为空") } return uc.repo.DeleteByIDs(ctx, ids) } func (uc *AnnouncementUsecase) Find(ctx context.Context, id uint) (*Announcement, error) { if id == 0 { return nil, errors.New("公告ID不能为空") } return uc.repo.Find(ctx, id) } func (uc *AnnouncementUsecase) List(ctx context.Context, filter AnnouncementFilter) ([]*Announcement, int64, error) { return uc.repo.List(ctx, filter) } func (uc *AnnouncementUsecase) UserOptions(ctx context.Context) ([]UserOption, error) { return uc.repo.UserOptions(ctx) }