package timelineservicelogic import ( "app-cloudep-tweeting-service/internal/domain" "app-cloudep-tweeting-service/internal/domain/repository" "context" ers "code.30cm.net/digimon/library-go/errs" "app-cloudep-tweeting-service/gen_result/pb/tweeting" "app-cloudep-tweeting-service/internal/svc" "github.com/zeromicro/go-zero/core/logx" ) type AddPostLogic struct { ctx context.Context svcCtx *svc.ServiceContext logx.Logger } func NewAddPostLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AddPostLogic { return &AddPostLogic{ ctx: ctx, svcCtx: svcCtx, Logger: logx.WithContext(ctx), } } type addPostReq struct { UID string `json:"uid" validate:"required"` } // AddPost 加入貼文,只管一股腦全塞,這裡會自動判斷 func (l *AddPostLogic) AddPost(in *tweeting.AddPostToTimelineReq) (*tweeting.OKResp, error) { // 驗證資料 if err := l.svcCtx.Validate.ValidateAll(&addPostReq{ UID: in.GetUid(), }); err != nil { // 錯誤代碼 05-011-00 return nil, ers.InvalidFormat(err.Error()) } if len(in.GetPosts()) == 0 { // 沒資料,直接 OK return &tweeting.OKResp{}, nil } post := make([]repository.TimelineItem, 0, len(in.GetPosts())) for _, item := range in.GetPosts() { post = append(post, repository.TimelineItem{ PostID: item.PostId, Score: item.CreatedAt, }) } err := l.svcCtx.TimelineRepo.AddPost(l.ctx, repository.AddPostRequest{ UID: in.GetUid(), PostItems: post, }) if err != nil { // 錯誤代碼 05-021-20 e := domain.CommentErrorL( domain.AddTimeLineErrorCode, logx.WithContext(l.ctx), []logx.LogField{ {Key: "req", Value: in}, {Key: "func", Value: "TimelineRepo.AddPost"}, {Key: "err", Value: err}, }, "failed to insert timeline repo :", in.GetUid()).Wrap(err) return nil, e } return &tweeting.OKResp{}, nil }