kra-oa/internal/biz/announcement.go

101 lines
2.5 KiB
Go

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)
}