github.com/cloudreve/Cloudreve/v3@v3.0.0-20240224133659-3edb00a6484c/service/admin/share.go (about)

     1  package admin
     2  
     3  import (
     4  	"strings"
     5  
     6  	model "github.com/cloudreve/Cloudreve/v3/models"
     7  	"github.com/cloudreve/Cloudreve/v3/pkg/hashid"
     8  	"github.com/cloudreve/Cloudreve/v3/pkg/serializer"
     9  	"github.com/gin-gonic/gin"
    10  )
    11  
    12  // ShareBatchService 分享批量操作服务
    13  type ShareBatchService struct {
    14  	ID []uint `json:"id" binding:"min=1"`
    15  }
    16  
    17  // Delete 删除文件
    18  func (service *ShareBatchService) Delete(c *gin.Context) serializer.Response {
    19  	if err := model.DB.Where("id in (?)", service.ID).Delete(&model.Share{}).Error; err != nil {
    20  		return serializer.DBErr("Failed to delete share record", err)
    21  	}
    22  	return serializer.Response{}
    23  }
    24  
    25  // Shares 列出分享
    26  func (service *AdminListService) Shares() serializer.Response {
    27  	var res []model.Share
    28  	total := 0
    29  
    30  	tx := model.DB.Model(&model.Share{})
    31  	if service.OrderBy != "" {
    32  		tx = tx.Order(service.OrderBy)
    33  	}
    34  
    35  	for k, v := range service.Conditions {
    36  		tx = tx.Where(k+" = ?", v)
    37  	}
    38  
    39  	if len(service.Searches) > 0 {
    40  		search := ""
    41  		for k, v := range service.Searches {
    42  			search += k + " like '%" + v + "%' OR "
    43  		}
    44  		search = strings.TrimSuffix(search, " OR ")
    45  		tx = tx.Where(search)
    46  	}
    47  
    48  	// 计算总数用于分页
    49  	tx.Count(&total)
    50  
    51  	// 查询记录
    52  	tx.Limit(service.PageSize).Offset((service.Page - 1) * service.PageSize).Find(&res)
    53  
    54  	// 查询对应用户,同时计算HashID
    55  	users := make(map[uint]model.User)
    56  	hashIDs := make(map[uint]string, len(res))
    57  	for _, file := range res {
    58  		users[file.UserID] = model.User{}
    59  		hashIDs[file.ID] = hashid.HashID(file.ID, hashid.ShareID)
    60  	}
    61  
    62  	userIDs := make([]uint, 0, len(users))
    63  	for k := range users {
    64  		userIDs = append(userIDs, k)
    65  	}
    66  
    67  	var userList []model.User
    68  	model.DB.Where("id in (?)", userIDs).Find(&userList)
    69  
    70  	for _, v := range userList {
    71  		users[v.ID] = v
    72  	}
    73  
    74  	return serializer.Response{Data: map[string]interface{}{
    75  		"total": total,
    76  		"items": res,
    77  		"users": users,
    78  		"ids":   hashIDs,
    79  	}}
    80  }