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  }