github.com/cloudreve/Cloudreve/v3@v3.0.0-20240224133659-3edb00a6484c/routers/controllers/share.go (about) 1 package controllers 2 3 import ( 4 "context" 5 "path" 6 "strings" 7 8 model "github.com/cloudreve/Cloudreve/v3/models" 9 "github.com/cloudreve/Cloudreve/v3/pkg/serializer" 10 "github.com/cloudreve/Cloudreve/v3/pkg/util" 11 "github.com/cloudreve/Cloudreve/v3/service/share" 12 "github.com/gin-gonic/gin" 13 ) 14 15 // CreateShare 创建分享 16 func CreateShare(c *gin.Context) { 17 var service share.ShareCreateService 18 if err := c.ShouldBindJSON(&service); err == nil { 19 res := service.Create(c) 20 c.JSON(200, res) 21 } else { 22 c.JSON(200, ErrorResponse(err)) 23 } 24 } 25 26 // GetShare 查看分享 27 func GetShare(c *gin.Context) { 28 var service share.ShareGetService 29 if err := c.ShouldBindQuery(&service); err == nil { 30 res := service.Get(c) 31 c.JSON(200, res) 32 } else { 33 c.JSON(200, ErrorResponse(err)) 34 } 35 } 36 37 // ListShare 列出分享 38 func ListShare(c *gin.Context) { 39 var service share.ShareListService 40 if err := c.ShouldBindQuery(&service); err == nil { 41 res := service.List(c, CurrentUser(c)) 42 c.JSON(200, res) 43 } else { 44 c.JSON(200, ErrorResponse(err)) 45 } 46 } 47 48 // SearchShare 搜索分享 49 func SearchShare(c *gin.Context) { 50 var service share.ShareListService 51 if err := c.ShouldBindQuery(&service); err == nil { 52 res := service.Search(c) 53 c.JSON(200, res) 54 } else { 55 c.JSON(200, ErrorResponse(err)) 56 } 57 } 58 59 // UpdateShare 更新分享属性 60 func UpdateShare(c *gin.Context) { 61 var service share.ShareUpdateService 62 if err := c.ShouldBindJSON(&service); err == nil { 63 res := service.Update(c) 64 c.JSON(200, res) 65 } else { 66 c.JSON(200, ErrorResponse(err)) 67 } 68 } 69 70 // DeleteShare 删除分享 71 func DeleteShare(c *gin.Context) { 72 var service share.Service 73 if err := c.ShouldBindUri(&service); err == nil { 74 res := service.Delete(c, CurrentUser(c)) 75 c.JSON(200, res) 76 } else { 77 c.JSON(200, ErrorResponse(err)) 78 } 79 } 80 81 // GetShareDownload 创建分享下载会话 82 func GetShareDownload(c *gin.Context) { 83 var service share.Service 84 if err := c.ShouldBindQuery(&service); err == nil { 85 res := service.CreateDownloadSession(c) 86 c.JSON(200, res) 87 } else { 88 c.JSON(200, ErrorResponse(err)) 89 } 90 } 91 92 // PreviewShare 预览分享文件内容 93 func PreviewShare(c *gin.Context) { 94 // 创建上下文 95 ctx, cancel := context.WithCancel(context.Background()) 96 defer cancel() 97 98 var service share.Service 99 if err := c.ShouldBindQuery(&service); err == nil { 100 res := service.PreviewContent(ctx, c, false) 101 // 是否需要重定向 102 if res.Code == -301 { 103 c.Redirect(302, res.Data.(string)) 104 return 105 } 106 // 是否有错误发生 107 if res.Code != 0 { 108 c.JSON(200, res) 109 } 110 } else { 111 c.JSON(200, ErrorResponse(err)) 112 } 113 } 114 115 // PreviewShareText 预览文本文件 116 func PreviewShareText(c *gin.Context) { 117 // 创建上下文 118 ctx, cancel := context.WithCancel(context.Background()) 119 defer cancel() 120 121 var service share.Service 122 if err := c.ShouldBindQuery(&service); err == nil { 123 res := service.PreviewContent(ctx, c, true) 124 // 是否有错误发生 125 if res.Code != 0 { 126 c.JSON(200, res) 127 } 128 } else { 129 c.JSON(200, ErrorResponse(err)) 130 } 131 } 132 133 // PreviewShareReadme 预览文本自述文件 134 func PreviewShareReadme(c *gin.Context) { 135 // 创建上下文 136 ctx, cancel := context.WithCancel(context.Background()) 137 defer cancel() 138 139 var service share.Service 140 if err := c.ShouldBindQuery(&service); err == nil { 141 // 自述文件名限制 142 allowFileName := []string{"readme.txt", "readme.md"} 143 fileName := strings.ToLower(path.Base(service.Path)) 144 if !util.ContainsString(allowFileName, fileName) { 145 c.JSON(200, serializer.ParamErr("Not a README file", nil)) 146 } 147 148 // 必须是目录分享 149 if shareCtx, ok := c.Get("share"); ok { 150 if !shareCtx.(*model.Share).IsDir { 151 c.JSON(200, serializer.ParamErr("This share has no README file", nil)) 152 } 153 } 154 155 res := service.PreviewContent(ctx, c, true) 156 // 是否有错误发生 157 if res.Code != 0 { 158 c.JSON(200, res) 159 } 160 } else { 161 c.JSON(200, ErrorResponse(err)) 162 } 163 } 164 165 // GetShareDocPreview 创建分享Office文档预览地址 166 func GetShareDocPreview(c *gin.Context) { 167 var service share.Service 168 if err := c.ShouldBindQuery(&service); err == nil { 169 res := service.CreateDocPreviewSession(c) 170 c.JSON(200, res) 171 } else { 172 c.JSON(200, ErrorResponse(err)) 173 } 174 } 175 176 // ListSharedFolder 列出分享的目录下的对象 177 func ListSharedFolder(c *gin.Context) { 178 var service share.Service 179 if err := c.ShouldBindUri(&service); err == nil { 180 res := service.List(c) 181 c.JSON(200, res) 182 } else { 183 c.JSON(200, ErrorResponse(err)) 184 } 185 } 186 187 // SearchSharedFolder 搜索分享的目录下的对象 188 func SearchSharedFolder(c *gin.Context) { 189 var service share.SearchService 190 if err := c.ShouldBindUri(&service); err != nil { 191 c.JSON(200, ErrorResponse(err)) 192 return 193 } 194 195 if err := c.ShouldBindQuery(&service); err != nil { 196 c.JSON(200, ErrorResponse(err)) 197 return 198 } 199 200 res := service.Search(c) 201 c.JSON(200, res) 202 } 203 204 // ArchiveShare 打包要下载的分享 205 func ArchiveShare(c *gin.Context) { 206 var service share.ArchiveService 207 if err := c.ShouldBindJSON(&service); err == nil { 208 res := service.Archive(c) 209 c.JSON(200, res) 210 } else { 211 c.JSON(200, ErrorResponse(err)) 212 } 213 } 214 215 // ShareThumb 获取分享目录下文件的缩略图 216 func ShareThumb(c *gin.Context) { 217 var service share.Service 218 if err := c.ShouldBindQuery(&service); err == nil { 219 res := service.Thumb(c) 220 if res.Code >= 0 { 221 c.JSON(200, res) 222 } 223 } else { 224 c.JSON(200, ErrorResponse(err)) 225 } 226 } 227 228 // GetUserShare 查看给定用户的分享 229 func GetUserShare(c *gin.Context) { 230 var service share.ShareUserGetService 231 if err := c.ShouldBindQuery(&service); err == nil { 232 res := service.Get(c) 233 c.JSON(200, res) 234 } else { 235 c.JSON(200, ErrorResponse(err)) 236 } 237 }