130 行
3.6 KiB
Go
130 行
3.6 KiB
Go
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")
|
|
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)
|
|
}
|