Compare commits

...

4 Commits

Author SHA1 Message Date
sugarBecomer 19a13a0ad2 ✨ 后端新增修改任务标题接口
新增 PUT /task/title/{id} 接口,支持修改今日校园任务标题
2026-04-23 10:41:40 +08:00
sugarBecomer 5d7f79a619 🐛 修改域名 2026-04-07 14:37:12 +08:00
sugarBecomer 0934994f51 🐛 修复邮件问题 2026-03-27 16:12:35 +08:00
sugarBecomer ef61d405ba 🐛 更新golang版本 2026-03-27 15:32:24 +08:00
8 changed files with 71 additions and 2 deletions
+1 -1
View File
@@ -4,7 +4,7 @@ permissions:
on: [release]
env:
IMAGE: RecordingTheSmile/likedream-go
REGISTRY: git.likedream.xyz
REGISTRY: mycoder.cc.cd
jobs:
Build-And-Upload:
runs-on: ubuntu-latest
+1 -1
View File
@@ -1,4 +1,4 @@
FROM golang:1.24-alpine AS backend-builder
FROM golang:1.25-alpine AS backend-builder
WORKDIR /build
COPY . .
+6
View File
@@ -54,6 +54,12 @@ type PostCpTaskExecuteReq struct {
ExecuteDays []int `json:"execute_days"`
}
type UpdateTaskTitleReq struct {
g.Meta `path:"/task/title/{id}" method:"put" tags:"CpTask" summary:"修改任务标题"`
Id int64 `json:"id"`
Title string `json:"title" v:"required#标题不能为空"`
}
type DeleteTaskReq struct {
g.Meta `path:"/task/{id}" method:"delete" tags:"CpTask" summary:"删除任务"`
Id int64 `json:"id"`
@@ -56,6 +56,11 @@ func (c CpTaskCtrlV1) Delete(ctx context.Context, req *v1.DeleteTaskReq) (res *u
return service.Global.CpTask.Delete(ctx, req), nil
}
func (c CpTaskCtrlV1) UpdateTaskTitle(ctx context.Context, req *v1.UpdateTaskTitleReq) (res *utils.Response[any], err error) {
defer utils.Pass(&err)
return service.Global.CpTask.UpdateTaskTitle(ctx, req), nil
}
func (c CpTaskCtrlV1) ExecuteNow(ctx context.Context, req *v1.ExecuteNowReq) (res *utils.Response[any], err error) {
defer utils.Pass(&err)
return service.Global.CpTask.ExecuteNow(ctx, req), nil
@@ -19,6 +19,7 @@ type ICpTaskCtrlV1 interface {
ExecuteNow(ctx context.Context, req *v1.ExecuteNowReq) (res *utils.Response[any], err error)
PauseTask(ctx context.Context, req *v1.PauseTaskReq) (res *utils.Response[any], err error)
FindLocation(ctx context.Context, req *v1.FindLocationReq) (res *utils.Response[any], err error)
UpdateTaskTitle(ctx context.Context, req *v1.UpdateTaskTitleReq) (res *utils.Response[any], err error)
GetTaskStatistics(ctx context.Context, req *v1.GetTaskStatisticsReq) (res *utils.Response[[]*v1.TaskStatisticsItem], err error)
GetTaskStatisticsV2(ctx context.Context, req *v1.GetTaskStatisticsV2Req) (res *utils.Response[[]*v1.TaskStatisticsV2Item], err error)
GetDashboardSummary(ctx context.Context, req *v1.GetDashboardSummaryReq) (res *utils.Response[*v1.DashboardSummary], err error)
+12
View File
@@ -216,6 +216,18 @@ func (v CpTaskServiceV1) PostExecute(ctx context.Context, req *v1.PostCpTaskExec
return utils.SuccessWithMsg("更新成功")
}
func (v CpTaskServiceV1) UpdateTaskTitle(ctx context.Context, req *v1.UpdateTaskTitleReq) *utils.Response[any] {
user := utils.GetUserInfoFromCtx(ctx)
cpTask := db2.Global.CpTask.Query().
Where(cptask.ID(req.Id), cptask.HasSysUserWith(sysuser.ID(user.ID))).
OnlyX(ctx)
if cpTask == nil {
utils.OkOrPanic(errors2.NewBusinessError(404, "任务不存在"))
}
db2.Global.CpTask.UpdateOne(cpTask).SetTitle(req.Title).ExecX(ctx)
return utils.SuccessWithMsg("修改成功")
}
func (v CpTaskServiceV1) Delete(ctx context.Context, req *v1.DeleteTaskReq) *utils.Response[any] {
user := utils.GetUserInfoFromCtx(ctx)
// 检测是否属于自己的cpTask
+37
View File
@@ -120,6 +120,43 @@ func NormalizeConfig(cfg EmailConfig) EmailConfig {
return cfg
}
func (s *EmailServiceV1) SaveAuthorizedOutlookConfig(ctx context.Context, cfg EmailConfig) error {
cfg = NormalizeConfig(cfg)
configs := map[string]string{
cst2.ConfigEmailAuthMode: AuthModeOutlookOAuth2,
cst2.ConfigEmailFromEmail: cfg.FromEmail,
cst2.ConfigEmailOAuthTenant: cfg.OAuthTenant,
cst2.ConfigEmailOAuthClientID: cfg.OAuthClientID,
cst2.ConfigEmailOAuthClientSecret: cfg.OAuthClientSecret,
cst2.ConfigEmailOAuthRedirectURL: cfg.OAuthRedirectURL,
cst2.ConfigEmailOAuthRefreshToken: cfg.OAuthRefreshToken,
cst2.ConfigEmailOAuthScope: cfg.OAuthScope,
}
for key, value := range configs {
exists, err := db.Global.SysConfig.Query().Where(sysconfig.KeyEQ(key)).Exist(ctx)
if err != nil {
return err
}
if exists {
if _, err = db.Global.SysConfig.Update().Where(sysconfig.KeyEQ(key)).SetValue(value).Save(ctx); err != nil {
return err
}
continue
}
if _, err = db.Global.SysConfig.Create().
SetKey(key).
SetValue(value).
SetDescription("邮件配置").
Save(ctx); err != nil {
return err
}
}
return nil
}
func (s *EmailServiceV1) ValidateConfig(cfg EmailConfig) error {
cfg = NormalizeConfig(cfg)
+8
View File
@@ -106,6 +106,14 @@ func (s *EmailServiceV1) ExchangeOutlookAuthorizeCode(ctx context.Context, state
if token.RefreshToken == "" {
return "", session.FrontendOrigin, fmt.Errorf("no refresh token returned, please ensure offline_access scope is granted")
}
session.Config.AuthMode = AuthModeOutlookOAuth2
session.Config.OAuthRedirectURL = session.CallbackURL
session.Config.OAuthRefreshToken = token.RefreshToken
if err = s.SaveAuthorizedOutlookConfig(ctx, session.Config); err != nil {
return "", session.FrontendOrigin, err
}
return token.RefreshToken, session.FrontendOrigin, nil
}