chore: 初始化 Cloudreve 源码仓库

This commit is contained in:
2026-09-13 11:28:59 +08:00
commit 2a7b03ab1d
489 changed files with 163867 additions and 0 deletions
+666
View File
@@ -0,0 +1,666 @@
package controllers
import (
"github.com/cloudreve/Cloudreve/v4/pkg/serializer"
"github.com/cloudreve/Cloudreve/v4/service/admin"
"github.com/gin-gonic/gin"
)
// AdminSummary 获取管理站点概况
func AdminSummary(c *gin.Context) {
service := ParametersFromContext[*admin.SummaryService](c, admin.SummaryParamCtx{})
res, err := service.Summary(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: res})
}
// AdminGetSettings 获取站点设定项
func AdminGetSettings(c *gin.Context) {
service := ParametersFromContext[*admin.GetSettingService](c, admin.GetSettingParamCtx{})
res, err := service.GetSetting(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: res})
}
func AdminSetSettings(c *gin.Context) {
service := ParametersFromContext[*admin.SetSettingService](c, admin.SetSettingParamCtx{})
res, err := service.SetSetting(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: res})
}
// AdminListGroups 获取用户组列表
func AdminListGroups(c *gin.Context) {
service := ParametersFromContext[*admin.AdminListService](c, admin.AdminListServiceParamsCtx{})
res, err := service.List(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: res})
}
func AdminFetchWopi(c *gin.Context) {
service := ParametersFromContext[*admin.FetchWOPIDiscoveryService](c, admin.FetchWOPIDiscoveryParamCtx{})
res, err := service.Fetch(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: res})
}
// AdminTestThumbGenerator Tests thumb generator
func AdminTestThumbGenerator(c *gin.Context) {
service := ParametersFromContext[*admin.ThumbGeneratorTestService](c, admin.ThumbGeneratorTestParamCtx{})
res, err := service.Test(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: res})
}
func AdminGetQueueMetrics(c *gin.Context) {
res, err := admin.GetQueueMetrics(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: res})
}
func AdminListPolicies(c *gin.Context) {
service := ParametersFromContext[*admin.AdminListService](c, admin.AdminListServiceParamsCtx{})
res, err := service.Policies(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: res})
}
func AdminGetPolicy(c *gin.Context) {
service := ParametersFromContext[*admin.SingleStoragePolicyService](c, admin.GetStoragePolicyParamCtx{})
res, err := service.Get(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: res})
}
// AdminSendTestMail 发送测试邮件
func AdminSendTestMail(c *gin.Context) {
service := ParametersFromContext[*admin.TestSMTPService](c, admin.TestSMTPParamCtx{})
err := service.Test(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{})
}
func AdminCreatePolicy(c *gin.Context) {
service := ParametersFromContext[*admin.CreateStoragePolicyService](c, admin.CreateStoragePolicyParamCtx{})
res, err := service.Create(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: res})
}
func AdminUpdatePolicy(c *gin.Context) {
service := ParametersFromContext[*admin.UpdateStoragePolicyService](c, admin.UpdateStoragePolicyParamCtx{})
res, err := service.Update(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: res})
}
func AdminListNodes(c *gin.Context) {
service := ParametersFromContext[*admin.AdminListService](c, admin.AdminListServiceParamsCtx{})
res, err := service.Nodes(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: res})
}
func AdminGetNode(c *gin.Context) {
service := ParametersFromContext[*admin.SingleNodeService](c, admin.SingleNodeParamCtx{})
res, err := service.Get(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: res})
}
func AdminClearEntityUrlCache(c *gin.Context) {
admin.ClearEntityUrlCache(c)
c.JSON(200, serializer.Response{})
}
func AdminCreateStoragePolicyCors(c *gin.Context) {
service := ParametersFromContext[*admin.CreateStoragePolicyCorsService](c, admin.CreateStoragePolicyCorsParamCtx{})
err := service.Create(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{})
}
func AdminOdOAuthURL(c *gin.Context) {
service := ParametersFromContext[*admin.GetOauthRedirectService](c, admin.GetOauthRedirectParamCtx{})
res, err := service.GetOAuth(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: res})
}
func AdminGetPolicyOAuthCallbackURL(c *gin.Context) {
res := admin.GetPolicyOAuthURL(c)
c.JSON(200, serializer.Response{Data: res})
}
func AdminGetPolicyOAuthStatus(c *gin.Context) {
service := ParametersFromContext[*admin.SingleStoragePolicyService](c, admin.GetStoragePolicyParamCtx{})
res, err := service.GetOauthCredentialStatus(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: res})
}
func AdminFinishOauthCallback(c *gin.Context) {
service := ParametersFromContext[*admin.FinishOauthCallbackService](c, admin.FinishOauthCallbackParamCtx{})
err := service.Finish(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{})
}
func AdminGetSharePointDriverRoot(c *gin.Context) {
service := ParametersFromContext[*admin.SingleStoragePolicyService](c, admin.GetStoragePolicyParamCtx{})
res, err := service.GetSharePointDriverRoot(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: res})
}
func AdminDeletePolicy(c *gin.Context) {
service := ParametersFromContext[*admin.SingleStoragePolicyService](c, admin.GetStoragePolicyParamCtx{})
err := service.Delete(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{})
}
func AdminGetGroup(c *gin.Context) {
service := ParametersFromContext[*admin.SingleGroupService](c, admin.SingleGroupParamCtx{})
res, err := service.Get(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: res})
}
func AdminCreateGroup(c *gin.Context) {
service := ParametersFromContext[*admin.UpsertGroupService](c, admin.UpsertGroupParamCtx{})
res, err := service.Create(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: res})
}
func AdminUpdateGroup(c *gin.Context) {
service := ParametersFromContext[*admin.UpsertGroupService](c, admin.UpsertGroupParamCtx{})
res, err := service.Update(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: res})
}
func AdminListUsers(c *gin.Context) {
service := ParametersFromContext[*admin.AdminListService](c, admin.AdminListServiceParamsCtx{})
res, err := service.Users(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: res})
}
func AdminGetUser(c *gin.Context) {
service := ParametersFromContext[*admin.SingleUserService](c, admin.SingleUserParamCtx{})
res, err := service.Get(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: res})
}
func AdminUpdateUser(c *gin.Context) {
service := ParametersFromContext[*admin.UpsertUserService](c, admin.UpsertUserParamCtx{})
res, err := service.Update(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: res})
}
func AdminCreateUser(c *gin.Context) {
service := ParametersFromContext[*admin.UpsertUserService](c, admin.UpsertUserParamCtx{})
res, err := service.Create(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: res})
}
// func AdminHashIDEncode(c *gin.Context) {
// service := ParametersFromContext[*admin.HashIDService](c, admin.HashIDParamCtx{})
// resp, err := service.Encode(c)
// if err != nil {
// c.JSON(200, serializer.Err(c, err))
// c.Abort()
// return
// }
//
// c.JSON(200, serializer.Response{
// Data: resp,
// })
// }
//
// func AdminHashIDDecode(c *gin.Context) {
// service := ParametersFromContext[*admin.HashIDService](c, admin.HashIDParamCtx{})
// resp, err := service.Decode(c)
// if err != nil {
// c.JSON(200, serializer.Err(c, err))
// c.Abort()
// return
// }
//
// c.JSON(200, serializer.Response{
// Data: resp,
// })
// }
//
// func AdminBsEncode(c *gin.Context) {
// service := ParametersFromContext[*admin.BsEncodeService](c, admin.BsEncodeParamCtx{})
// resp, err := service.Encode(c)
// if err != nil {
// c.JSON(200, serializer.Err(c, err))
// c.Abort()
// return
// }
//
// c.JSON(200, serializer.Response{
// Data: resp,
// })
// }
//
// func AdminBsDecode(c *gin.Context) {
// service := ParametersFromContext[*admin.BsDecodeService](c, admin.BsDecodeParamCtx{})
// resp, err := service.Decode(c)
// if err != nil {
// c.JSON(200, serializer.Err(c, err))
// c.Abort()
// return
// }
//
// c.JSON(200, serializer.Response{
// Data: resp,
// })
// }
//
func AdminDeleteGroup(c *gin.Context) {
service := ParametersFromContext[*admin.SingleGroupService](c, admin.SingleGroupParamCtx{})
err := service.Delete(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{})
}
// AdminTestSlave 测试从机可用性
func AdminTestSlave(c *gin.Context) {
service := ParametersFromContext[*admin.TestNodeService](c, admin.TestNodeParamCtx{})
err := service.Test(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{})
}
// AdminTestDownloader 测试下载器连接
func AdminTestDownloader(c *gin.Context) {
service := ParametersFromContext[*admin.TestNodeDownloaderService](c, admin.TestNodeDownloaderParamCtx{})
res, err := service.Test(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: res})
}
func AdminCreateNode(c *gin.Context) {
service := ParametersFromContext[*admin.UpsertNodeService](c, admin.UpsertNodeParamCtx{})
res, err := service.Create(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: res})
}
func AdminUpdateNode(c *gin.Context) {
service := ParametersFromContext[*admin.UpsertNodeService](c, admin.UpsertNodeParamCtx{})
res, err := service.Update(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: res})
}
func AdminDeleteNode(c *gin.Context) {
service := ParametersFromContext[*admin.SingleNodeService](c, admin.SingleNodeParamCtx{})
err := service.Delete(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{})
}
// AdminDeleteUser 批量删除用户
func AdminDeleteUser(c *gin.Context) {
service := ParametersFromContext[*admin.BatchUserService](c, admin.BatchUserParamCtx{})
err := service.Delete(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{})
}
func AdminListFiles(c *gin.Context) {
service := ParametersFromContext[*admin.AdminListService](c, admin.AdminListServiceParamsCtx{})
res, err := service.Files(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: res})
}
func AdminGetFile(c *gin.Context) {
service := ParametersFromContext[*admin.SingleFileService](c, admin.SingleFileParamCtx{})
res, err := service.Get(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: res})
}
func AdminUpdateFile(c *gin.Context) {
service := ParametersFromContext[*admin.UpsertFileService](c, admin.UpsertFileParamCtx{})
res, err := service.Update(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: res})
}
func AdminGetFileUrl(c *gin.Context) {
service := ParametersFromContext[*admin.SingleFileService](c, admin.SingleFileParamCtx{})
res, err := service.Url(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: res})
}
func AdminBatchDeleteFile(c *gin.Context) {
service := ParametersFromContext[*admin.BatchFileService](c, admin.BatchFileParamCtx{})
err := service.Delete(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{})
}
func AdminListEntities(c *gin.Context) {
service := ParametersFromContext[*admin.AdminListService](c, admin.AdminListServiceParamsCtx{})
res, err := service.Entities(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: res})
}
func AdminGetEntity(c *gin.Context) {
service := ParametersFromContext[*admin.SingleEntityService](c, admin.SingleEntityParamCtx{})
res, err := service.Get(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: res})
}
func AdminGetEntityUrl(c *gin.Context) {
service := ParametersFromContext[*admin.SingleEntityService](c, admin.SingleEntityParamCtx{})
res, err := service.Url(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: res})
}
func AdminBatchDeleteEntity(c *gin.Context) {
service := ParametersFromContext[*admin.BatchEntityService](c, admin.BatchEntityParamCtx{})
err := service.Delete(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
}
func AdminCleanupTask(c *gin.Context) {
service := ParametersFromContext[*admin.CleanupTaskService](c, admin.CleanupTaskParameterCtx{})
err := service.CleanupTask(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{})
}
func AdminListTasks(c *gin.Context) {
service := ParametersFromContext[*admin.AdminListService](c, admin.AdminListServiceParamsCtx{})
res, err := service.Tasks(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: res})
}
func AdminGetTask(c *gin.Context) {
service := ParametersFromContext[*admin.SingleTaskService](c, admin.SingleTaskParamCtx{})
res, err := service.Get(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: res})
}
func AdminBatchDeleteTask(c *gin.Context) {
service := ParametersFromContext[*admin.BatchTaskService](c, admin.BatchTaskParamCtx{})
err := service.Delete(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{})
}
func AdminListShares(c *gin.Context) {
service := ParametersFromContext[*admin.AdminListService](c, admin.AdminListServiceParamsCtx{})
res, err := service.Shares(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: res})
}
func AdminGetShare(c *gin.Context) {
service := ParametersFromContext[*admin.SingleShareService](c, admin.SingleShareParamCtx{})
res, err := service.Get(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: res})
}
func AdminBatchDeleteShare(c *gin.Context) {
service := ParametersFromContext[*admin.BatchShareService](c, admin.BatchShareParamCtx{})
err := service.Delete(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{})
}
func AdminCalibrateStorage(c *gin.Context) {
service := ParametersFromContext[*admin.SingleUserService](c, admin.SingleUserParamCtx{})
res, err := service.CalibrateStorage(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: res})
}
// AdminListOAuthClients lists OAuth clients
func AdminListOAuthClients(c *gin.Context) {
service := ParametersFromContext[*admin.AdminListService](c, admin.AdminListServiceParamsCtx{})
res, err := service.OAuthClients(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: res})
}
// AdminGetOAuthClient gets an OAuth client by ID
func AdminGetOAuthClient(c *gin.Context) {
service := ParametersFromContext[*admin.SingleOAuthClientService](c, admin.SingleOAuthClientParamCtx{})
res, err := service.Get(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: res})
}
// AdminCreateOAuthClient creates a new OAuth client
func AdminCreateOAuthClient(c *gin.Context) {
service := ParametersFromContext[*admin.UpsertOAuthClientService](c, admin.UpsertOAuthClientParamCtx{})
res, err := service.Create(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: res})
}
// AdminUpdateOAuthClient updates an OAuth client
func AdminUpdateOAuthClient(c *gin.Context) {
service := ParametersFromContext[*admin.UpsertOAuthClientService](c, admin.UpsertOAuthClientParamCtx{})
res, err := service.Update(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: res})
}
// AdminDeleteOAuthClient deletes an OAuth client
func AdminDeleteOAuthClient(c *gin.Context) {
service := ParametersFromContext[*admin.SingleOAuthClientService](c, admin.SingleOAuthClientParamCtx{})
err := service.Delete(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{})
}
// AdminBatchDeleteOAuthClient batch deletes OAuth clients
func AdminBatchDeleteOAuthClient(c *gin.Context) {
service := ParametersFromContext[*admin.BatchOAuthClientService](c, admin.BatchOAuthClientParamCtx{})
err := service.Delete(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{})
}
+126
View File
@@ -0,0 +1,126 @@
package controllers
import (
"fmt"
"github.com/cloudreve/Cloudreve/v4/pkg/filemanager/driver/upyun"
"github.com/cloudreve/Cloudreve/v4/pkg/filemanager/fs"
"github.com/cloudreve/Cloudreve/v4/pkg/filemanager/manager"
"github.com/cloudreve/Cloudreve/v4/pkg/logging"
"github.com/cloudreve/Cloudreve/v4/pkg/serializer"
"github.com/cloudreve/Cloudreve/v4/pkg/util"
"github.com/cloudreve/Cloudreve/v4/service/callback"
"github.com/gin-gonic/gin"
"github.com/qiniu/go-sdk/v7/auth/qbox"
)
// RemoteCallback process callback request to complete upload
func ProcessCallback(failedStatusCode int, generalResp bool) gin.HandlerFunc {
return func(c *gin.Context) {
err := callback.ProcessCallback(c)
if err != nil {
if generalResp {
c.JSON(failedStatusCode, serializer.GeneralUploadCallbackFailed{Error: err.Error()})
} else {
c.JSON(failedStatusCode, serializer.Err(c, err))
}
return
}
c.JSON(200, serializer.Response{})
}
}
// QiniuCallbackAuth 七牛回调签名验证
func QiniuCallbackValidate(c *gin.Context) {
session := c.MustGet(manager.UploadSessionCtx).(*fs.UploadSession)
// 验证回调是否来自qiniu
mac := qbox.NewMac(session.Policy.AccessKey, session.Policy.SecretKey)
ok, err := mac.VerifyCallback(c.Request)
if err != nil {
util.Log().Debug("Failed to verify callback request: %s", err)
c.JSON(401, serializer.GeneralUploadCallbackFailed{Error: "Failed to verify callback request."})
c.Abort()
return
}
if !ok {
c.JSON(401, serializer.GeneralUploadCallbackFailed{Error: "Invalid signature."})
c.Abort()
return
}
c.Next()
}
// OSSCallbackValidate 阿里云OSS上传回调
func OSSCallbackValidate(c *gin.Context) {
var callbackBody callback.UploadCallbackService
if err := c.ShouldBindJSON(&callbackBody); err == nil {
uploadSession := c.MustGet(manager.UploadSessionCtx).(*fs.UploadSession)
if uploadSession.Props.Size != callbackBody.Size {
l := logging.FromContext(c)
l.Error("Callback validate failed: size mismatch, expected: %d, actual:%d", uploadSession.Props.Size, callbackBody.Size)
c.JSON(401,
serializer.GeneralUploadCallbackFailed{
Error: fmt.Sprintf("size mismatch"),
})
c.Abort()
return
}
c.Next()
} else {
c.JSON(401, ErrorResponse(err))
c.Abort()
}
}
// UpyunCallbackAuth 又拍云回调签名验证
func UpyunCallbackAuth(c *gin.Context) {
uploadSession := c.MustGet(manager.UploadSessionCtx).(*fs.UploadSession)
l := logging.FromContext(c)
if err := upyun.ValidateCallback(c, uploadSession); err != nil {
l.Error("Failed to verify callback request: %s", err)
c.JSON(401, serializer.GeneralUploadCallbackFailed{Error: "Failed to verify callback request."})
}
c.Next()
}
// OneDriveOAuth OneDrive 授权回调
func OneDriveOAuth(c *gin.Context) {
//var callbackBody callback.OauthService
//if err := c.ShouldBindQuery(&callbackBody); err == nil {
// res := callbackBody.OdAuth(c)
// redirect := model.GetSiteURL()
// redirect.Path = path.Join(redirect.Path, "/admin/policy")
// queries := redirect.Query()
// queries.Add("code", strconv.Itoa(res.Code))
// queries.Add("msg", res.Msg)
// queries.Add("err", res.Error)
// redirect.RawQuery = queries.Encode()
// c.Redirect(303, redirect.String())
//} else {
// c.JSON(200, ErrorResponse(err))
//}
}
// GoogleDriveOAuth Google Drive 授权回调
func GoogleDriveOAuth(c *gin.Context) {
//var callbackBody callback.OauthService
//if err := c.ShouldBindQuery(&callbackBody); err == nil {
// res := callbackBody.GDriveAuth(c)
// redirect := model.GetSiteURL()
// redirect.Path = path.Join(redirect.Path, "/admin/policy")
// queries := redirect.Query()
// queries.Add("code", strconv.Itoa(res.Code))
// queries.Add("msg", res.Msg)
// queries.Add("err", res.Error)
// redirect.RawQuery = queries.Encode()
// c.Redirect(303, redirect.String())
//} else {
// c.JSON(200, ErrorResponse(err))
//}
}
+27
View File
@@ -0,0 +1,27 @@
package controllers
import (
"errors"
"github.com/cloudreve/Cloudreve/v4/pkg/serializer"
"github.com/cloudreve/Cloudreve/v4/service/explorer"
"github.com/gin-gonic/gin"
)
// ListDirectory 列出目录下内容
func ListDirectory(c *gin.Context) {
service := ParametersFromContext[*explorer.ListFileService](c, explorer.ListFileParameterCtx{})
resp, err := service.List(c)
if err != nil {
if errors.Is(err, explorer.ErrSSETakeOver) {
return
}
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{
Data: resp,
})
}
+479
View File
@@ -0,0 +1,479 @@
package controllers
import (
"github.com/cloudreve/Cloudreve/v4/pkg/request"
"github.com/cloudreve/Cloudreve/v4/pkg/serializer"
"github.com/cloudreve/Cloudreve/v4/service/explorer"
"github.com/gin-gonic/gin"
)
func DownloadArchive(c *gin.Context) {
service := ParametersFromContext[*explorer.ArchiveService](c, explorer.ArchiveParamCtx{})
err := service.DownloadArchived(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
}
// CreateArchive 创建文件压缩任务
func CreateArchive(c *gin.Context) {
service := ParametersFromContext[*explorer.ArchiveWorkflowService](c, explorer.CreateArchiveParamCtx{})
resp, err := service.CreateCompressTask(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
if resp != nil {
c.JSON(200, serializer.Response{
Data: resp,
})
}
}
// ImportFiles imports files
func ImportFiles(c *gin.Context) {
service := ParametersFromContext[*explorer.ImportWorkflowService](c, explorer.CreateImportParamCtx{})
resp, err := service.CreateImportTask(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
if resp != nil {
c.JSON(200, serializer.Response{
Data: resp,
})
}
}
// CreateRemoteDownload creates remote download task
func CreateRemoteDownload(c *gin.Context) {
service := ParametersFromContext[*explorer.DownloadWorkflowService](c, explorer.CreateDownloadParamCtx{})
resp, err := service.CreateDownloadTask(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
if resp != nil {
c.JSON(200, serializer.Response{
Data: resp,
})
}
}
// RebuildFTSIndex rebuilds full text search index for files
func RebuildFTSIndex(c *gin.Context) {
service := ParametersFromContext[*explorer.RebuildFTSIndexWorkflowService](c, explorer.CreateRebuildFTSIndexParamCtx{})
resp, err := service.CreateRebuildFTSIndexTask(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{
Data: resp,
})
}
// ExtractArchive creates extract archive task
func ExtractArchive(c *gin.Context) {
service := ParametersFromContext[*explorer.ArchiveWorkflowService](c, explorer.CreateArchiveParamCtx{})
resp, err := service.CreateExtractTask(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
if resp != nil {
c.JSON(200, serializer.Response{
Data: resp,
})
}
}
// AnonymousPermLink 文件中转后的永久直链接
func AnonymousPermLink(download bool) gin.HandlerFunc {
return func(c *gin.Context) {
name := c.Param("name")
if err := explorer.RedirectDirectLink(c, name, download); err != nil {
c.JSON(404, serializer.Err(c, err))
c.Abort()
return
}
}
}
// GetSource 获取文件的外链地址
func GetSource(c *gin.Context) {
service := ParametersFromContext[*explorer.GetDirectLinkService](c, explorer.GetDirectLinkParamCtx{})
res, err := service.Get(c)
if err != nil && len(res) == 0 {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
if err != nil {
// Not fully completed
errResp := serializer.Err(c, err)
errResp.Data = res
c.JSON(200, errResp)
return
}
c.JSON(200, serializer.Response{Data: res})
}
func DeleteDirectLink(c *gin.Context) {
err := explorer.DeleteDirectLink(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{})
}
// Thumb 获取文件缩略图
func Thumb(c *gin.Context) {
service := ParametersFromContext[*explorer.FileThumbService](c, explorer.FileThumbParameterCtx{})
res, err := service.Get(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{Data: res})
}
// FileURL get temporary file url for preview or download
func FileURL(c *gin.Context) {
service := ParametersFromContext[*explorer.FileURLService](c, explorer.FileURLParameterCtx{})
resp, err := service.Get(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
if resp != nil {
c.JSON(200, serializer.Response{
Data: resp,
})
}
}
// ServeEntity download entity content
func ServeEntity(c *gin.Context) {
service := ParametersFromContext[*explorer.EntityDownloadService](c, explorer.EntityDownloadParameterCtx{})
err := service.Serve(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
}
// CreateViewerSession creates a viewer session
func CreateViewerSession(c *gin.Context) {
service := ParametersFromContext[*explorer.CreateViewerSessionService](c, explorer.CreateViewerSessionParamCtx{})
resp, err := service.Create(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
if resp != nil {
c.JSON(200, serializer.Response{
Data: resp,
})
}
}
// PutContent 更新文件内容
func PutContent(c *gin.Context) {
service := ParametersFromContext[*explorer.FileUpdateService](c, explorer.FileUpdateParameterCtx{})
res, err := service.PutContent(c, nil)
if err != nil {
c.JSON(200, serializer.Err(c, err))
request.BlackHole(c.Request.Body)
c.Abort()
return
}
c.JSON(200, serializer.Response{Data: res})
}
// FileUpload 本地策略文件上传
func FileUpload(c *gin.Context) {
service := ParametersFromContext[*explorer.UploadService](c, explorer.UploadParameterCtx{})
err := service.LocalUpload(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
request.BlackHole(c.Request.Body)
c.Abort()
return
}
c.JSON(200, serializer.Response{})
}
// DeleteUploadSession 删除上传会话
func DeleteUploadSession(c *gin.Context) {
service := ParametersFromContext[*explorer.DeleteUploadSessionService](c, explorer.DeleteUploadSessionParameterCtx{})
err := service.Delete(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{})
}
// CreateUploadSession 创建上传会话
func CreateUploadSession(c *gin.Context) {
service := ParametersFromContext[*explorer.CreateUploadSessionService](c, explorer.CreateUploadSessionParameterCtx{})
resp, err := service.Create(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{
Data: resp,
})
}
// CreateFile 创建空白文件
func CreateFile(c *gin.Context) {
service := ParametersFromContext[*explorer.CreateFileService](c, explorer.CreateFileParameterCtx{})
resp, err := service.Create(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{
Data: resp,
})
}
// RenameFile Renames a file.
func RenameFile(c *gin.Context) {
service := ParametersFromContext[*explorer.RenameFileService](c, explorer.RenameFileParameterCtx{})
resp, err := service.Rename(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{
Data: resp,
})
}
// MoveFile Moves or Copy files.
func MoveFile(c *gin.Context) {
service := ParametersFromContext[*explorer.MoveFileService](c, explorer.MoveFileParameterCtx{})
if err := service.Move(c); err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{})
}
// Delete 删除文件或目录
func Delete(c *gin.Context) {
service := ParametersFromContext[*explorer.DeleteFileService](c, explorer.DeleteFileParameterCtx{})
err := service.Delete(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{})
}
// Restore restore file or directory
func Restore(c *gin.Context) {
service := ParametersFromContext[*explorer.DeleteFileService](c, explorer.DeleteFileParameterCtx{})
err := service.Restore(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{})
}
// EmptyTrash hard-deletes every top-level item in the current user's trash bin.
func EmptyTrash(c *gin.Context) {
err := explorer.EmptyTrash(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{})
}
// Unlock unlocks files by given tokens
func Unlock(c *gin.Context) {
service := ParametersFromContext[*explorer.UnlockFileService](c, explorer.UnlockFileParameterCtx{})
err := service.Unlock(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{})
}
// Pin pins files by given uri
func Pin(c *gin.Context) {
service := ParametersFromContext[*explorer.PinFileService](c, explorer.PinFileParameterCtx{})
err := service.PinFile(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{})
}
// Unpin unpins files by given uri
func Unpin(c *gin.Context) {
service := ParametersFromContext[*explorer.PinFileService](c, explorer.PinFileParameterCtx{})
err := service.UnpinFile(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{})
}
// PatchMetadata patch metadata
func PatchMetadata(c *gin.Context) {
service := ParametersFromContext[*explorer.PatchMetadataService](c, explorer.PatchMetadataParameterCtx{})
err := service.Patch(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{})
}
// GetFileInfo gets file info
func GetFileInfo(c *gin.Context) {
service := ParametersFromContext[*explorer.GetFileInfoService](c, explorer.GetFileInfoParameterCtx{})
resp, err := service.Get(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{
Data: resp,
})
}
// SetCurrentVersion sets current version
func SetCurrentVersion(c *gin.Context) {
service := ParametersFromContext[*explorer.SetCurrentVersionService](c, explorer.SetCurrentVersionParamCtx{})
err := service.Set(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{})
}
// DeleteVersion deletes a version
func DeleteVersion(c *gin.Context) {
service := ParametersFromContext[*explorer.DeleteVersionService](c, explorer.DeleteVersionParamCtx{})
err := service.Delete(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{})
}
func PatchView(c *gin.Context) {
service := ParametersFromContext[*explorer.PatchViewService](c, explorer.PatchViewParameterCtx{})
err := service.Patch(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{})
}
func ListArchiveFiles(c *gin.Context) {
service := ParametersFromContext[*explorer.ArchiveListFilesService](c, explorer.ArchiveListFilesParamCtx{})
resp, err := service.List(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{
Data: resp,
})
}
func HandleExplorerEventsPush(c *gin.Context) {
service := ParametersFromContext[*explorer.ExplorerEventService](c, explorer.ExplorerEventParamCtx{})
err := service.HandleExplorerEventsPush(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
}
func FulltextSearch(c *gin.Context) {
service := ParametersFromContext[*explorer.FulltextSearchService](c, explorer.FulltextSearchParamCtx{})
resp, err := service.Search(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{
Data: resp,
})
}
+119
View File
@@ -0,0 +1,119 @@
package controllers
import (
"context"
"encoding/json"
"github.com/cloudreve/Cloudreve/v4/pkg/serializer"
"github.com/gin-gonic/gin"
"github.com/go-playground/validator/v10"
)
// ParamErrorMsg 根据Validator返回的错误信息给出错误提示
func ParamErrorMsg(filed string, tag string) string {
// 未通过验证的表单域与中文对应
fieldMap := map[string]string{
"UserName": "Email",
"Password": "Password",
"Path": "Path",
"SourceID": "Source resource",
"URL": "URL",
"Nick": "Nickname",
}
// 未通过的规则与中文对应
tagMap := map[string]string{
"required": "cannot be empty",
"min": "too short",
"max": "too long",
"email": "format error",
}
fieldVal, findField := fieldMap[filed]
if !findField {
fieldVal = filed
}
tagVal, findTag := tagMap[tag]
if findTag {
// 返回拼接出来的错误信息
return fieldVal + " " + tagVal
}
return ""
}
// ErrorResponse 返回错误消息
func ErrorResponse(err error) serializer.Response {
// 处理 Validator 产生的错误
if ve, ok := err.(validator.ValidationErrors); ok {
for _, e := range ve {
return serializer.ParamErrDeprecated(
ParamErrorMsg(e.Field(), e.Tag()),
err,
)
}
}
if _, ok := err.(*json.UnmarshalTypeError); ok {
return serializer.ParamErrDeprecated("JSON marshall error", err)
}
return serializer.ParamErrDeprecated("Parameter error", err)
}
// FromJSON Parse and validate JSON from request body
func FromJSON[T any](ctxKey any) gin.HandlerFunc {
return func(c *gin.Context) {
var service T
if err := c.ShouldBindJSON(&service); err == nil {
c.Request = c.Request.WithContext(context.WithValue(c.Request.Context(), ctxKey, &service))
c.Next()
} else {
c.JSON(200, ErrorResponse(err))
c.Abort()
}
}
}
// FromQuery Parse and validate form from request query
func FromQuery[T any](ctxKey any) gin.HandlerFunc {
return func(c *gin.Context) {
var service T
if err := c.ShouldBindQuery(&service); err == nil {
c.Request = c.Request.WithContext(context.WithValue(c.Request.Context(), ctxKey, &service))
c.Next()
} else {
c.JSON(200, ErrorResponse(err))
c.Abort()
}
}
}
func FromForm[T any](ctxKey any) gin.HandlerFunc {
return func(c *gin.Context) {
var service T
if err := c.ShouldBind(&service); err == nil {
c.Request = c.Request.WithContext(context.WithValue(c.Request.Context(), ctxKey, &service))
c.Next()
} else {
c.JSON(200, ErrorResponse(err))
c.Abort()
}
}
}
// FromUri Parse and validate form from request uri
func FromUri[T any](ctxKey any) gin.HandlerFunc {
return func(c *gin.Context) {
var service T
if err := c.ShouldBindUri(&service); err == nil {
c.Request = c.Request.WithContext(context.WithValue(c.Request.Context(), ctxKey, &service))
c.Next()
} else {
c.JSON(200, ErrorResponse(err))
c.Abort()
}
}
}
// ParametersFromContext retrieves request parameters from context
func ParametersFromContext[T any](c *gin.Context, ctxKey any) T {
return c.Request.Context().Value(ctxKey).(T)
}
+80
View File
@@ -0,0 +1,80 @@
package controllers
import (
"github.com/cloudreve/Cloudreve/v4/pkg/serializer"
"github.com/cloudreve/Cloudreve/v4/service/oauth"
"github.com/gin-gonic/gin"
)
func GetAppRegistration(c *gin.Context) {
service := ParametersFromContext[*oauth.GetAppRegistrationService](c, oauth.GetAppRegistrationParamCtx{})
app, err := service.Get(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{Data: app})
}
func GrantAppConsent(c *gin.Context) {
service := ParametersFromContext[*oauth.GrantService](c, oauth.GrantParamCtx{})
res, err := service.Get(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{Data: res})
}
type ExchangeErrorResponse struct {
Error string `json:"error"`
ErrorDescription string `json:"error_description"`
ErrorCodes []int `json:"error_codes"`
CorrelationID string `json:"correlation_id"`
}
func ExchangeToken(c *gin.Context) {
service := ParametersFromContext[*oauth.ExchangeTokenService](c, oauth.ExchangeTokenParamCtx{})
res, err := service.Exchange(c)
if err != nil {
errResp := serializer.Err(c, err)
c.JSON(400, ExchangeErrorResponse{
Error: errResp.Msg,
ErrorDescription: errResp.Error,
ErrorCodes: []int{errResp.Code},
CorrelationID: errResp.CorrelationID,
})
c.Abort()
return
}
c.JSON(200, res)
}
func OpenIDUserInfo(c *gin.Context) {
service := ParametersFromContext[*oauth.UserInfoService](c, oauth.UserInfoParamCtx{})
res, err := service.GetUserInfo(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, res)
}
func DeleteOAuthGrant(c *gin.Context) {
service := ParametersFromContext[*oauth.DeleteOAuthGrantService](c, oauth.DeleteOAuthGrantParamCtx{})
err := service.Delete(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{})
}
+88
View File
@@ -0,0 +1,88 @@
package controllers
import (
"github.com/cloudreve/Cloudreve/v4/pkg/hashid"
"github.com/cloudreve/Cloudreve/v4/pkg/serializer"
"github.com/cloudreve/Cloudreve/v4/service/share"
"github.com/gin-gonic/gin"
"net/http"
)
// CreateShare 创建分享
func CreateShare(c *gin.Context) {
service := ParametersFromContext[*share.ShareCreateService](c, share.ShareCreateParamCtx{})
uri, err := service.Upsert(c, 0)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: uri})
}
// EditShare 编辑分享
func EditShare(c *gin.Context) {
service := ParametersFromContext[*share.ShareCreateService](c, share.ShareCreateParamCtx{})
uri, err := service.Upsert(c, hashid.FromContext(c))
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: uri})
}
// GetShare 查看分享
func GetShare(c *gin.Context) {
service := ParametersFromContext[*share.ShareInfoService](c, share.ShareInfoParamCtx{})
info, err := service.Get(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: info})
}
// ListShare 列出分享
func ListShare(c *gin.Context) {
service := ParametersFromContext[*share.ListShareService](c, share.ListShareParamCtx{})
resp, err := service.List(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
if resp != nil {
c.JSON(200, serializer.Response{
Data: resp,
})
}
}
// DeleteShare 删除分享
func DeleteShare(c *gin.Context) {
err := share.DeleteShare(c, hashid.FromContext(c))
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{})
}
func BatchDeleteShare(c *gin.Context) {
service := ParametersFromContext[*share.BatchDeleteShareService](c, share.BatchDeleteParamCtx{})
err := service.Delete(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
}
c.JSON(200, serializer.Response{})
}
func ShareRedirect(c *gin.Context) {
service := ParametersFromContext[*share.ShortLinkRedirectService](c, share.ShortLinkRedirectParamCtx{})
c.Redirect(http.StatusFound, service.RedirectTo(c))
}
+79
View File
@@ -0,0 +1,79 @@
package controllers
import (
"github.com/cloudreve/Cloudreve/v4/application/constants"
"github.com/cloudreve/Cloudreve/v4/application/dependency"
"github.com/cloudreve/Cloudreve/v4/pkg/serializer"
"github.com/cloudreve/Cloudreve/v4/service/basic"
"github.com/gin-gonic/gin"
)
// SiteConfig 获取站点全局配置
func SiteConfig(c *gin.Context) {
service := ParametersFromContext[*basic.GetSettingService](c, basic.GetSettingParamCtx{})
resp, err := service.GetSiteConfig(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{
Data: resp,
})
}
// Ping 状态检查页面
func Ping(c *gin.Context) {
version := constants.BackendVersion
if constants.IsProBool {
version += "-pro"
}
c.JSON(200, serializer.Response{
Code: 0,
Data: version,
})
}
// Captcha 获取验证码
func Captcha(c *gin.Context) {
c.JSON(200, serializer.Response{
Code: 0,
Data: basic.GetCaptchaImage(c),
})
}
// Manifest 获取manifest.json
func Manifest(c *gin.Context) {
settingClient := dependency.FromContext(c).SettingProvider()
siteOpts := settingClient.SiteBasic(c)
pwaOpts := settingClient.PWA(c)
c.Header("Cache-Control", "public, no-cache")
c.JSON(200, map[string]interface{}{
"short_name": siteOpts.Name,
"name": siteOpts.Name,
"icons": []map[string]string{
{
"src": pwaOpts.SmallIcon,
"sizes": "64x64 32x32 24x24 16x16",
"type": "image/x-icon",
},
{
"src": pwaOpts.MediumIcon,
"type": "image/png",
"sizes": "192x192",
},
{
"src": pwaOpts.LargeIcon,
"type": "image/png",
"sizes": "512x512",
},
},
"start_url": ".",
"display": pwaOpts.Display,
"theme_color": pwaOpts.ThemeColor,
"background_color": pwaOpts.BackgroundColor,
})
}
+301
View File
@@ -0,0 +1,301 @@
package controllers
import (
"errors"
"fmt"
"github.com/cloudreve/Cloudreve/v4/pkg/cluster"
"github.com/cloudreve/Cloudreve/v4/pkg/downloader"
"github.com/cloudreve/Cloudreve/v4/pkg/downloader/slave"
"github.com/cloudreve/Cloudreve/v4/pkg/filemanager/fs"
"github.com/cloudreve/Cloudreve/v4/pkg/request"
"github.com/cloudreve/Cloudreve/v4/pkg/serializer"
"github.com/cloudreve/Cloudreve/v4/service/admin"
"github.com/cloudreve/Cloudreve/v4/service/explorer"
"github.com/cloudreve/Cloudreve/v4/service/node"
"github.com/gin-gonic/gin"
)
// SlaveUpload 从机文件上传
func SlaveUpload(c *gin.Context) {
service := ParametersFromContext[*explorer.UploadService](c, explorer.UploadParameterCtx{})
err := service.SlaveUpload(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
request.BlackHole(c.Request.Body)
c.Abort()
return
}
c.JSON(200, serializer.Response{})
}
// SlaveGetUploadSession 从机创建上传会话
func SlaveGetUploadSession(c *gin.Context) {
service := ParametersFromContext[*explorer.SlaveCreateUploadSessionService](c, explorer.SlaveCreateUploadSessionParamCtx{})
if err := service.Create(c); err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{})
}
// SlaveDeleteUploadSession 从机删除上传会话
func SlaveDeleteUploadSession(c *gin.Context) {
service := ParametersFromContext[*explorer.SlaveDeleteUploadSessionService](c, explorer.SlaveDeleteUploadSessionParamCtx{})
if err := service.Delete(c); err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{})
}
// SlaveServeEntity download entity content
func SlaveServeEntity(c *gin.Context) {
service := ParametersFromContext[*explorer.EntityDownloadService](c, explorer.EntityDownloadParameterCtx{})
err := service.SlaveServe(c)
if err != nil {
c.JSON(400, serializer.Err(c, err))
c.Abort()
return
}
}
// SlaveMeta retrieve media metadata
func SlaveMeta(c *gin.Context) {
service := ParametersFromContext[*explorer.SlaveMetaService](c, explorer.SlaveMetaParamCtx{})
res, err := service.MediaMeta(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.NewResponseWithGobData(c, res))
}
// SlaveThumb 从机文件缩略图
func SlaveThumb(c *gin.Context) {
service := ParametersFromContext[*explorer.SlaveThumbService](c, explorer.SlaveThumbParamCtx{})
err := service.Thumb(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
}
// SlaveDelete 从机删除
func SlaveDelete(c *gin.Context) {
service := ParametersFromContext[*explorer.SlaveDeleteFileService](c, explorer.SlaveDeleteFileParamCtx{})
if failed, err := service.Delete(c); err != nil {
c.JSON(200, serializer.NewResponseWithGobData(c, serializer.Response{
Code: serializer.CodeNotFullySuccess,
Data: failed,
Msg: fmt.Sprintf("Failed to delete %d files(s)", len(failed)),
Error: err.Error(),
}))
} else {
c.JSON(200, serializer.Response{Data: ""})
}
}
// SlavePing 从机测试
func SlavePing(c *gin.Context) {
service := ParametersFromContext[*admin.SlavePingService](c, admin.SlavePingParameterCtx{})
if err := service.Test(c); err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{})
}
// SlaveList 从机列出文件
func SlaveList(c *gin.Context) {
service := ParametersFromContext[*explorer.SlaveListService](c, explorer.SlaveListParamCtx{})
objects, err := service.List(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.NewResponseWithGobData(c, objects))
}
// SlaveDownloadTaskCreate creates a download task on slave
func SlaveDownloadTaskCreate(c *gin.Context) {
service := ParametersFromContext[*slave.CreateSlaveDownload](c, node.CreateSlaveDownloadTaskParamCtx{})
d := c.MustGet(downloader.DownloaderCtxKey).(downloader.Downloader)
handle, err := d.CreateTask(c, service.Url, service.Options)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.NewResponseWithGobData(c, handle))
}
// SlaveDownloadTaskStatus 查询从机 Aria2 任务状态
func SlaveDownloadTaskStatus(c *gin.Context) {
service := ParametersFromContext[*slave.GetSlaveDownload](c, node.GetSlaveDownloadTaskParamCtx{})
d := c.MustGet(downloader.DownloaderCtxKey).(downloader.Downloader)
info, err := d.Info(c, service.Handle)
if err != nil {
if errors.Is(err, downloader.ErrTaskNotFount) {
c.JSON(200, serializer.NewError(serializer.CodeNotFound, "task not found", err))
c.Abort()
return
}
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.NewResponseWithGobData(c, info))
}
// SlaveCancelDownloadTask 取消从机离线下载任务
func SlaveCancelDownloadTask(c *gin.Context) {
service := ParametersFromContext[*slave.CancelSlaveDownload](c, node.CancelSlaveDownloadTaskParamCtx{})
d := c.MustGet(downloader.DownloaderCtxKey).(downloader.Downloader)
err := d.Cancel(c, service.Handle)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{})
}
// SlaveSelectFilesToDownload 从机选取离线下载文件
func SlaveSelectFilesToDownload(c *gin.Context) {
service := ParametersFromContext[*slave.SetSlaveFilesToDownload](c, node.SelectSlaveDownloadFilesParamCtx{})
d := c.MustGet(downloader.DownloaderCtxKey).(downloader.Downloader)
err := d.SetFilesToDownload(c, service.Handle, service.Args...)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{})
}
// SlaveTestDownloader 从机测试下载器连接
func SlaveTestDownloader(c *gin.Context) {
d := c.MustGet(downloader.DownloaderCtxKey).(downloader.Downloader)
res, err := d.Test(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{Data: res})
}
// SlaveGetOauthCredential 从机获取主机的OneDrive存储策略凭证
func SlaveGetCredential(c *gin.Context) {
service := ParametersFromContext[*node.OauthCredentialService](c, node.OauthCredentialParamCtx{})
cred, err := service.Get(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.NewResponseWithGobData(c, cred))
}
// SlaveCreateTask creates tasks and register it in registry
func SlaveCreateTask(c *gin.Context) {
service := ParametersFromContext[*cluster.CreateSlaveTask](c, node.CreateSlaveTaskParamCtx{})
taskId, err := node.CreateTaskInSlave(service, c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.NewResponseWithGobData(c, taskId))
}
// SlaveCreateTask creates tasks and register it in registry
func SlaveGetTask(c *gin.Context) {
service := ParametersFromContext[*node.GetSlaveTaskService](c, node.GetSlaveTaskParamCtx{})
task, err := service.Get(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.NewResponseWithGobData(c, task))
}
func SlaveCleanupFolder(c *gin.Context) {
service := ParametersFromContext[*cluster.FolderCleanup](c, node.FolderCleanupParamCtx{})
if err := node.Cleanup(service, c); err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{})
}
func StatelessPrepareUpload(c *gin.Context) {
service := ParametersFromContext[*fs.StatelessPrepareUploadService](c, node.StatelessPrepareUploadParamCtx{})
uploadSession, err := node.StatelessPrepareUpload(service, c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.NewResponseWithGobData(c, uploadSession))
}
func StatelessCompleteUpload(c *gin.Context) {
service := ParametersFromContext[*fs.StatelessCompleteUploadService](c, node.StatelessCompleteUploadParamCtx{})
_, err := node.StatelessCompleteUpload(service, c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{})
}
func StatelessOnUploadFailed(c *gin.Context) {
service := ParametersFromContext[*fs.StatelessOnUploadFailedService](c, node.StatelessOnUploadFailedParamCtx{})
if err := node.StatelessOnUploadFailed(service, c); err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{})
}
func StatelessCreateFile(c *gin.Context) {
service := ParametersFromContext[*fs.StatelessCreateFileService](c, node.StatelessCreateFileParamCtx{})
if err := node.StatelessCreateFile(service, c); err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{})
}
+391
View File
@@ -0,0 +1,391 @@
package controllers
import (
"github.com/cloudreve/Cloudreve/v4/application/dependency"
"github.com/cloudreve/Cloudreve/v4/ent"
"github.com/cloudreve/Cloudreve/v4/inventory"
"github.com/cloudreve/Cloudreve/v4/pkg/hashid"
"github.com/cloudreve/Cloudreve/v4/pkg/serializer"
"github.com/cloudreve/Cloudreve/v4/pkg/util"
"github.com/cloudreve/Cloudreve/v4/service/share"
"github.com/cloudreve/Cloudreve/v4/service/user"
"github.com/gin-gonic/gin"
"github.com/samber/lo"
)
// StartLoginAuthn 开始注册WebAuthn登录
func StartLoginAuthn(c *gin.Context) {
res, err := user.PreparePasskeyLogin(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: res})
}
// FinishLoginAuthn 完成注册WebAuthn登录
func FinishLoginAuthn(c *gin.Context) {
service := ParametersFromContext[*user.FinishPasskeyLoginService](c, user.FinishPasskeyLoginParameterCtx{})
u, err := service.FinishPasskeyLogin(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
util.WithValue(c, inventory.UserCtx{}, u)
}
// StartRegAuthn 开始注册WebAuthn信息
func StartRegAuthn(c *gin.Context) {
res, err := user.PreparePasskeyRegister(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: res})
}
// FinishRegAuthn 完成注册WebAuthn信息
func FinishRegAuthn(c *gin.Context) {
service := ParametersFromContext[*user.FinishPasskeyRegisterService](c, user.FinishPasskeyRegisterParameterCtx{})
res, err := service.FinishPasskeyRegister(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{Data: res})
}
// UserDeletePasskey deletes user passkey
func UserDeletePasskey(c *gin.Context) {
service := ParametersFromContext[*user.DeletePasskeyService](c, user.DeletePasskeyParameterCtx{})
err := service.DeletePasskey(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{})
}
// UserLoginValidation validates user login request
func UserLoginValidation(c *gin.Context) {
service := ParametersFromContext[*user.UserLoginService](c, user.LoginParameterCtx{})
expectedUser, twoFaSession, err := service.Login(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
if twoFaSession == "" {
// No 2FA required, proceed
util.WithValue(c, inventory.UserCtx{}, expectedUser)
c.Next()
return
}
c.JSON(200, serializer.Response{Code: serializer.CodeNotFullySuccess, Data: twoFaSession})
c.Abort()
}
// UserLogin2FAValidation validates user OTP code
func UserLogin2FAValidation(c *gin.Context) {
service := ParametersFromContext[*user.OtpValidationService](c, user.OtpValidationParameterCtx{})
expectedUser, err := service.Verify2FA(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
util.WithValue(c, inventory.UserCtx{}, expectedUser)
c.Next()
}
// UserIssueToken generates new token pair for user
func UserIssueToken(c *gin.Context) {
resp, err := user.IssueToken(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{
Data: resp,
})
}
// UserRefreshToken refreshes token pair for user
func UserRefreshToken(c *gin.Context) {
service := ParametersFromContext[*user.RefreshTokenService](c, user.RefreshTokenParameterCtx{})
resp, err := service.Refresh(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{
Data: resp,
})
}
// UserRegister 用户注册
func UserRegister(c *gin.Context) {
service := ParametersFromContext[*user.UserRegisterService](c, user.RegisterParameterCtx{})
c.JSON(200, service.Register(c))
}
// UserSendReset 发送密码重设邮件
func UserSendReset(c *gin.Context) {
service := ParametersFromContext[*user.UserResetEmailService](c, user.UserResetEmailParameterCtx{})
if err := service.Reset(c); err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{})
}
// UserReset 重设密码
func UserReset(c *gin.Context) {
service := ParametersFromContext[*user.UserResetService](c, user.UserResetParameterCtx{})
res, err := service.Reset(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{Data: res})
}
// UserActivate 用户激活
func UserActivate(c *gin.Context) {
c.JSON(200, user.ActivateUser(c))
}
// UserSignOut 用户退出登录
func UserSignOut(c *gin.Context) {
service := ParametersFromContext[*user.RefreshTokenService](c, user.RefreshTokenParameterCtx{})
res, err := service.Delete(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{
Data: res,
})
}
// UserMe 获取当前登录的用户
func UserMe(c *gin.Context) {
dep := dependency.FromContext(c)
c.JSON(200, serializer.Response{
Data: user.BuildUser(inventory.UserFromContext(c), dep.HashIDEncoder()),
})
}
// UserGet 获取用户信息
func UserGet(c *gin.Context) {
u, err := user.GetUser(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
isAnonymous := inventory.IsAnonymousUser(inventory.UserFromContext(c))
redactLevel := user.RedactLevelUser
if isAnonymous {
redactLevel = user.RedactLevelAnonymous
}
c.JSON(200, serializer.Response{
Data: user.BuildUserRedacted(c, u, redactLevel, dependency.FromContext(c).HashIDEncoder()),
})
}
// UserStorage 获取用户的存储信息
func UserStorage(c *gin.Context) {
res, err := user.GetUserCapacity(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{
Data: res,
})
}
// UserSetting 获取用户设定
func UserSetting(c *gin.Context) {
res, err := user.GetUserSettings(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{
Data: res,
})
}
// UploadAvatar 从文件上传头像
func UploadAvatar(c *gin.Context) {
if err := user.UpdateUserAvatar(c); err != nil {
c.JSON(200, serializer.Err(c, err))
return
}
c.JSON(200, serializer.Response{})
}
// GetUserAvatar 获取用户头像
func GetUserAvatar(c *gin.Context) {
service := ParametersFromContext[*user.GetAvatarService](c, user.GetAvatarServiceParamsCtx{})
err := service.Get(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
}
// UpdateOption 更改用户设定
func UpdateOption(c *gin.Context) {
service := ParametersFromContext[*user.PatchUserSetting](c, user.PatchUserSettingParamsCtx{})
err := service.Patch(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{})
//var service user.SettingUpdateService
//if err := c.ShouldBindUri(&service); err == nil {
// var (
// subService user.OptionsChangeHandler
// subErr error
// )
//
// switch service.Option {
// case "nick":
// subService = &user.ChangerNick{}
// case "vip":
// subService = &user.VIPUnsubscribe{}
// case "qq":
// subService = &user.QQBind{}
// case "policy":
// subService = &user.PolicyChange{}
// case "homepage":
// subService = &user.HomePage{}
// case "password":
// subService = &user.PasswordChange{}
// case "2fa":
// subService = &user.Enable2FA{}
// case "authn":
// subService = &user.DeleteWebAuthn{}
// case "theme":
// subService = &user.ThemeChose{}
// default:
// subService = &user.ChangerNick{}
// }
//
// subErr = c.ShouldBindJSON(subService)
// if subErr != nil {
// c.JSON(200, ErrorResponse(subErr))
// return
// }
//
// res := subService.Update(c, CurrentUser(c))
// c.JSON(200, res)
//
//} else {
// c.JSON(200, ErrorResponse(err))
//}
}
// UserInit2FA 初始化二步验证
func UserInit2FA(c *gin.Context) {
secret, err := user.Init2FA(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{
Data: secret,
})
}
// UserPerformCopySession copy to create new session or refresh current session
func UserPerformCopySession(c *gin.Context) {
//var service user.CopySessionService
//if err := c.ShouldBindUri(&service); err == nil {
// res := service.Copy(c)
// c.JSON(200, res)
//} else {
// c.JSON(200, ErrorResponse(err))
//}
}
// UserPrepareLogin validates precondition for login
func UserPrepareLogin(c *gin.Context) {
service := ParametersFromContext[*user.PrepareLoginService](c, user.PrepareLoginParameterCtx{})
res, err := service.Prepare(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{Data: res})
}
// UserSearch Search user by keyword
func UserSearch(c *gin.Context) {
service := ParametersFromContext[*user.SearchUserService](c, user.SearchUserParamCtx{})
u, err := service.Search(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
hasher := dependency.FromContext(c).HashIDEncoder()
c.JSON(200, serializer.Response{
Data: lo.Map(u, func(item *ent.User, index int) user.User {
return user.BuildUserRedacted(c, item, user.RedactLevelUser, hasher)
}),
})
}
// ListPublicShare lists all public shares for given user
func ListPublicShare(c *gin.Context) {
service := ParametersFromContext[*share.ListShareService](c, share.ListShareParamCtx{})
resp, err := service.ListInUserProfile(c, hashid.FromContext(c))
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
if resp != nil {
c.JSON(200, serializer.Response{
Data: resp,
})
}
}
+101
View File
@@ -0,0 +1,101 @@
package controllers
import (
"github.com/cloudreve/Cloudreve/v4/pkg/serializer"
"github.com/cloudreve/Cloudreve/v4/service/setting"
"github.com/gin-gonic/gin"
)
// ListDavAccounts lists all WebDAV accounts.
func ListDavAccounts(c *gin.Context) {
service := ParametersFromContext[*setting.ListDavAccountsService](c, setting.ListDavAccountParamCtx{})
resp, err := service.List(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
if resp != nil {
c.JSON(200, serializer.Response{
Data: resp,
})
}
}
// CreateDAVAccounts 创建WebDAV账户
func CreateDAVAccounts(c *gin.Context) {
service := ParametersFromContext[*setting.CreateDavAccountService](c, setting.CreateDavAccountParamCtx{})
resp, err := service.Create(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{
Data: resp,
})
}
// UpdateDAVAccounts updates WebDAV accounts.
func UpdateDAVAccounts(c *gin.Context) {
service := ParametersFromContext[*setting.CreateDavAccountService](c, setting.CreateDavAccountParamCtx{})
resp, err := service.Update(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{
Data: resp,
})
}
// DeleteDAVAccounts deletes WebDAV accounts.
func DeleteDAVAccounts(c *gin.Context) {
err := setting.DeleteDavAccount(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{})
}
//
//// DeleteWebDAVAccounts 删除WebDAV账户
//func DeleteWebDAVAccounts(c *gin.Context) {
// var service setting.WebDAVAccountService
// if err := c.ShouldBindUri(&service); err == nil {
// res := service.Delete(c, CurrentUser(c))
// c.JSON(200, res)
// } else {
// c.JSON(200, ErrorResponse(err))
// }
//}
//
//// DeleteWebDAVMounts 删除WebDAV挂载
//func DeleteWebDAVMounts(c *gin.Context) {
// var service setting.WebDAVListService
// if err := c.ShouldBindUri(&service); err == nil {
// res := service.Unmount(c, CurrentUser(c))
// c.JSON(200, res)
// } else {
// c.JSON(200, ErrorResponse(err))
// }
//}
//
//
//// CreateWebDAVMounts 创建WebDAV目录挂载
//func CreateWebDAVMounts(c *gin.Context) {
// var service setting.WebDAVMountCreateService
// if err := c.ShouldBindJSON(&service); err == nil {
// res := service.Create(c, CurrentUser(c))
// c.JSON(200, res)
// } else {
// c.JSON(200, ErrorResponse(err))
// }
//}
+82
View File
@@ -0,0 +1,82 @@
package controllers
import (
"net/http"
"github.com/cloudreve/Cloudreve/v4/pkg/wopi"
"github.com/cloudreve/Cloudreve/v4/service/explorer"
"github.com/gin-gonic/gin"
)
// CheckFileInfo Get file info
func CheckFileInfo(c *gin.Context) {
var service explorer.WopiService
res, err := service.FileInfo(c)
if err != nil {
c.Status(http.StatusInternalServerError)
c.Header(wopi.ServerErrorHeader, err.Error())
return
}
c.JSON(200, res)
}
// GetFile Get file content
func GetFile(c *gin.Context) {
var service explorer.WopiService
err := service.GetFile(c)
if err != nil {
c.Status(http.StatusInternalServerError)
c.Header(wopi.ServerErrorHeader, err.Error())
return
}
}
// PutFile Puts file content
func PutFile(c *gin.Context) {
service := &explorer.WopiService{}
err := service.PutContent(c, false)
if err != nil {
c.Status(http.StatusInternalServerError)
c.Header(wopi.ServerErrorHeader, err.Error())
}
}
// ModifyFile Modify file properties
func ModifyFile(c *gin.Context) {
action := c.GetHeader(wopi.OverwriteHeader)
var (
service explorer.WopiService
err error
)
switch action {
case wopi.MethodLock:
err = service.Lock(c)
if err == nil {
return
}
case wopi.MethodRefreshLock:
err = service.RefreshLock(c)
if err == nil {
return
}
case wopi.MethodUnlock:
err = service.Unlock(c)
if err == nil {
return
}
case wopi.MethodPutRelative:
err = service.PutContent(c, true)
if err == nil {
return
}
default:
c.Status(http.StatusNotImplemented)
return
}
c.Status(http.StatusInternalServerError)
c.Header(wopi.ServerErrorHeader, err.Error())
return
}
+68
View File
@@ -0,0 +1,68 @@
package controllers
import (
"github.com/cloudreve/Cloudreve/v4/pkg/hashid"
"github.com/cloudreve/Cloudreve/v4/pkg/queue"
"github.com/cloudreve/Cloudreve/v4/pkg/serializer"
"github.com/cloudreve/Cloudreve/v4/service/explorer"
"github.com/gin-gonic/gin"
)
func ListTasks(c *gin.Context) {
service := ParametersFromContext[*explorer.ListTaskService](c, explorer.ListTaskParamCtx{})
resp, err := service.ListTasks(c)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
if resp != nil {
c.JSON(200, serializer.Response{
Data: resp,
})
}
}
func GetTaskPhaseProgress(c *gin.Context) {
taskId := hashid.FromContext(c)
resp, err := explorer.TaskPhaseProgress(c, taskId)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
if resp != nil {
c.JSON(200, serializer.Response{
Data: resp,
})
} else {
c.JSON(200, serializer.Response{Data: queue.Progresses{}})
}
}
func SetDownloadTaskTarget(c *gin.Context) {
taskId := hashid.FromContext(c)
service := ParametersFromContext[*explorer.SetDownloadFilesService](c, explorer.SetDownloadFilesParamCtx{})
err := service.SetDownloadFiles(c, taskId)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{})
}
func CancelDownloadTask(c *gin.Context) {
taskId := hashid.FromContext(c)
err := explorer.CancelDownloadTask(c, taskId)
if err != nil {
c.JSON(200, serializer.Err(c, err))
c.Abort()
return
}
c.JSON(200, serializer.Response{})
}