package service import ( "github.com/google/uuid" "integrity-checkin/data/po" "integrity-checkin/pkg/app" "integrity-checkin/pkg/util" "io" "os" "path/filepath" "strconv" "time" ) type CheckinService struct { } func (c CheckinService) Submit(aw *app.Wrapper) app.Result { uc := aw.ExtractUserClaims() var req po.UserActivityForm if err := aw.Ctx.ShouldBind(&req); err != nil { return aw.Error(err.Error()) } if err := req.Validate(); err != nil { return aw.Error(err.Error()) } today := time.Now().Format("20060102") // 检查是否为限制打卡总次数的活动 activity := checkinDAO.FindActivityByID(req.ActivityID) if activity == nil { return aw.Error("活动不存在") } else if activity.Limit > 0 { if checkinDAO.FindUserActivityInHistorySince(uc.UserID, req.ActivityID) != nil { return aw.Error("该打卡活动已经达到限制次数") } } // 检查当天是否已经打卡过 if checkinDAO.FindUserActivityByDay(uc.UserID, req.ActivityID, today) != nil { return aw.Error("您今天已参加过该项目,请明天再来") } userActivity, err := checkinDAO.CreateCheckin(uc.UserID, req.ActivityID, req.Files) if err != nil { return aw.Error(err.Error()) } return aw.Success(userActivity) } func (c CheckinService) SetStatus(aw *app.Wrapper) app.Result { type SetStatusReq struct { ID int `form:"id" binding:"required"` Status int `form:"status" binding:"required"` Credit int `form:"credit"` } var req SetStatusReq if err := aw.Ctx.ShouldBind(&req); err != nil { return aw.Error(err.Error()) } userActivity := checkinDAO.FindUserActivityByID(req.ID) if userActivity == nil { return aw.Error("打卡不存在") } if userActivity.Status != 1 { return aw.Error("已经审核过此打卡") } if req.Status == 1 { return aw.Error("只能是 2通过,3拒绝") } if req.Status == 2 { // pass if req.Credit < 1 { return aw.Error("打分无效") } user := userDAO.FindUserByID(userActivity.UserID) user.Credit += req.Credit userActivity.Credit = req.Credit userDAO.SaveUser(user) } userActivity.Status = req.Status checkinDAO.SaveUserActivity(userActivity) return aw.Success(userActivity) } func (c CheckinService) ListActivities(aw *app.Wrapper) app.Result { user := userDAO.FindUserByID(aw.ExtractUserClaims().UserID) isTeacher := false if user.Type == 2 { isTeacher = true } return aw.Success(checkinDAO.FindAllActivities(isTeacher)) } func (c CheckinService) ListUserActivities(aw *app.Wrapper) app.Result { uc := aw.ExtractUserClaims() type StatusReq struct { Status int `form:"status"` } var req StatusReq if err := aw.Ctx.ShouldBind(&req); err != nil { return aw.Error(err.Error()) } user := userDAO.FindUserByID(uc.UserID) return aw.Success(checkinDAO.FindUserActivitiesByStatusUserType(req.Status, user.Type)) } func (c CheckinService) GetUserActivity(aw *app.Wrapper) app.Result { id, err := strconv.Atoi(aw.Ctx.Query("id")) if err != nil { return aw.Error(err.Error()) } return aw.Success(checkinDAO.FindUserActivityByID(id)) } func (c CheckinService) GetMyActivitiesToday(aw *app.Wrapper) app.Result { return aw.Success(checkinDAO.FindUserActivitiesToday(aw.ExtractUserClaims().UserID, time.Now().Format("20060102"))) } func (c CheckinService) UploadFile(aw *app.Wrapper) app.Result { formFile, err := aw.Ctx.FormFile("file") if err != nil { return aw.Error(err.Error()) } file, err := formFile.Open() if err != nil { return aw.Error(err.Error()) } if err = util.ValidateFilename(formFile.Filename); err != nil { return aw.Error(err.Error()) } if _, err = os.Stat("files"); err != nil { err = os.Mkdir("files", 0666) if err != nil { return aw.Error(err.Error()) } } filename := uuid.New().String() + filepath.Ext(formFile.Filename) out, err := os.OpenFile("files/"+filename, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0666) if err != nil { return aw.Error(err.Error()) } defer out.Close() _, err = io.Copy(out, file) if err != nil { return aw.Error(err.Error()) } return aw.Success(filename) }