chore: 初始化 Cloudreve 源码仓库
This commit is contained in:
@@ -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{})
|
||||
}
|
||||
@@ -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))
|
||||
//}
|
||||
}
|
||||
@@ -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,
|
||||
})
|
||||
}
|
||||
@@ -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,
|
||||
})
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
@@ -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{})
|
||||
}
|
||||
@@ -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))
|
||||
}
|
||||
@@ -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,
|
||||
})
|
||||
}
|
||||
@@ -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{})
|
||||
}
|
||||
@@ -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,
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -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))
|
||||
// }
|
||||
//}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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{})
|
||||
}
|
||||
+1360
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user