2025-03-18 13:22:20 +08:00
package dao
import (
"StuAcaWorksAI/proto"
"gorm.io/gorm"
2025-03-28 20:17:47 +08:00
"log"
2025-03-18 13:22:20 +08:00
)
type File struct {
gorm . Model
// 存储文件名
FileStoreName string ` gorm:"column:file_store_name;type:varchar(255);uniqueIndex:idx_file_name" `
NeedAuth bool ` gorm:"column:need_auth" `
FileName string ` gorm:"column:file_name" `
FileSize int ` gorm:"column:file_size" `
FileType string ` gorm:"column:file_type" `
FilePath string ` gorm:"column:file_path" `
AuthID int ` gorm:"column:auth_id" `
Md5 string ` gorm:"column:md5;type:varchar(255);uniqueIndex:idx_file_name" `
}
type FileAuth struct {
gorm . Model
AuthID int ` gorm:"column:auth_id" `
FileID int ` gorm:"column:file_id" `
UserFileName string ` gorm:"column:user_file_name;type:varchar(255);uniqueIndex:idx_file_name" ` //对于同一个文件,不同用户有不同的文件名
UploadType string ` gorm:"column:upload_type" ` // 上传类型: im,avatar,file,config,config为系统文件
IsPrivate int ` gorm:"column:is_private" ` // 是否私有,私有文件只能自己下载或者通过分享链接下载,1为私有, 0为公开
ShareCode string ` gorm:"column:share_code" ` // 分享码,用于分享时的验证,构建分享链接
}
type ConfigFile struct {
gorm . Model
AuthID int ` gorm:"column:auth_id" `
FileName string ` gorm:"column:file_name" `
FilePath string ` gorm:"column:file_path" `
}
2025-03-28 20:17:47 +08:00
type FileAuthListResp struct {
2025-03-28 20:28:03 +08:00
FileAuth
2025-03-28 20:17:47 +08:00
FileStoreName string ` gorm:"column:file_store_name;type:varchar(255);uniqueIndex:idx_file_name" `
}
2025-03-29 14:02:21 +08:00
type UserFileListResp struct {
FileAuth
FileStoreName string ` json:"file_store_name" form:"file_store_name" `
}
2025-03-18 13:22:20 +08:00
func CreateFile ( fileStoreName , fileName , fileType , filePath , md5Str string , fileSize , authID int , NeedAuth bool ) File {
file := File { FileStoreName : fileStoreName , FileName : fileName , FileType : fileType , FilePath : filePath , FileSize : fileSize , AuthID : authID , NeedAuth : NeedAuth , Md5 : md5Str }
result := DB . Create ( & file )
if result . Error != nil {
return File { }
}
return file
}
func DeleteFileByID ( id , user int ) bool {
res := DB . Model ( & File { } ) . Where ( "id = ? and auth_id = ?" , id , user ) . Delete ( & File { } )
if res . Error != nil {
return false
}
return true
}
func FindFileByID ( id , auth_id int ) File {
var file File
DB . Where ( "id = ? and auth_id = ?" , id , auth_id ) . First ( & file )
return file
}
func FindFileByNames ( fileName string , auth_id int ) File {
var file File
DB . Where ( "file_name = ? and auth_id = ?" , fileName , auth_id ) . First ( & file )
return file
}
func FindFileByName ( fileName string ) File {
var file File
DB . Where ( "file_store_name = ?" , fileName ) . First ( & file )
return file
}
func FindFileByAuthID ( auth_id int ) [ ] File {
var files [ ] File
DB . Where ( "auth_id = ?" , auth_id ) . Find ( & files )
return files
}
func UpdateFileByID ( id , auth_id int , fileStoreName , fileName , fileType , filePath string , fileSize int ) bool {
pd := FindFileByID ( id , auth_id )
if pd . ID == 0 {
return false
}
result := DB . Model ( & File { } ) . Where ( "id = ? and auth_id = ?" , id , auth_id ) . Updates ( File { FileStoreName : fileStoreName , FileName : fileName , FileType : fileType , FilePath : filePath , FileSize : fileSize } )
if result . Error != nil {
return false
}
return true
}
func DeleteFileByAuthID ( auth_id int ) bool {
res := DB . Model ( & File { } ) . Where ( "auth_id = ?" , auth_id ) . Delete ( & File { } )
if res . Error != nil {
return false
}
return true
}
func DeleteFileById ( id int ) bool {
res := DB . Model ( & File { } ) . Where ( "id = ?" , id ) . Delete ( & File { } )
if res . Error != nil {
return false
}
return true
}
func FindFileByMd5 ( md5 string ) File {
var file File
if proto . Config . SERVER_SQL_LOG {
DB . Debug ( ) . Where ( "md5 = ?" , md5 ) . First ( & file )
} else {
DB . Where ( "md5 = ?" , md5 ) . First ( & file )
}
return file
}
func CreateFileAuth ( authID , fileID int , userFileName , uploadType string , isPrivate int , shareCode string ) FileAuth {
fileAuth := FileAuth { AuthID : authID , FileID : fileID , UserFileName : userFileName , UploadType : uploadType , IsPrivate : isPrivate , ShareCode : shareCode }
var result * gorm . DB
if proto . Config . SERVER_SQL_LOG {
result = DB . Debug ( ) . Create ( & fileAuth )
} else {
result = DB . Create ( & fileAuth )
}
if result . Error != nil {
return FileAuth { }
}
return fileAuth
}
func CreateConfigFile ( file ConfigFile ) ( id uint , err error ) {
var result * gorm . DB
if proto . Config . SERVER_SQL_LOG {
result = DB . Debug ( ) . Create ( & file )
} else {
result = DB . Create ( & file )
}
return file . ID , result . Error
}
func FindConfigFileByID ( id int , user_id int ) ConfigFile {
var file ConfigFile
if proto . Config . SERVER_SQL_LOG {
DB . Debug ( ) . Where ( "id = ? and auth_id = ?" , id , user_id ) . First ( & file )
} else {
DB . Where ( "id = ? and auth_id = ?" , id , user_id ) . First ( & file )
}
return file
}
func DeleteConfigFileByID ( id int ) error {
var res * gorm . DB
if proto . Config . SERVER_SQL_LOG {
res = DB . Debug ( ) . Delete ( & ConfigFile { } , id )
} else {
res = DB . Delete ( & ConfigFile { } , id )
}
return res . Error
}
func UpdateConfigFileByID ( id int , file ConfigFile ) error {
var res * gorm . DB
if proto . Config . SERVER_SQL_LOG {
res = DB . Debug ( ) . Model ( & ConfigFile { } ) . Where ( "id = ?" , id ) . Updates ( & file )
} else {
res = DB . Model ( & ConfigFile { } ) . Where ( "id = ?" , id ) . Updates ( & file )
}
return res . Error
}
func FindConfigFileByAuthID ( auth_id int ) [ ] ConfigFile {
var files [ ] ConfigFile
if proto . Config . SERVER_SQL_LOG {
DB . Debug ( ) . Where ( "auth_id = ?" , auth_id ) . Find ( & files )
} else {
DB . Where ( "auth_id = ?" , auth_id ) . Find ( & files )
}
return files
}
2025-03-28 19:09:34 +08:00
// 通用通过用户id及类型查询
2025-03-28 20:28:03 +08:00
func FileUserFileList ( userID int , fileType string ) ( [ ] FileAuth , [ ] File ) {
var fileAuths [ ] FileAuth
var files [ ] File
2025-03-28 20:17:47 +08:00
query := DB . Where ( "file_auths.auth_id = ? AND file_auths.upload_type = ?" , userID , fileType ) .
Joins ( "LEFT JOIN files ON file_auths.file_id = files.id" )
2025-03-28 19:09:34 +08:00
if proto . Config . SERVER_SQL_LOG {
2025-03-28 20:17:47 +08:00
query = query . Debug ( )
}
2025-03-28 20:28:03 +08:00
// 先查询 FileAuth 相关记录
resultAuth := query . Find ( & fileAuths )
if resultAuth . Error != nil {
log . Printf ( "查询文件认证列表时出错, UserID: %d, FileType: %s, 错误信息: %v" , userID , fileType , resultAuth . Error )
return nil , nil
2025-03-28 19:09:34 +08:00
}
2025-03-28 20:17:47 +08:00
2025-03-28 20:28:03 +08:00
// 如果有 FileAuth 记录,再查询对应的 File 记录
if len ( fileAuths ) > 0 {
fileIDs := make ( [ ] int , 0 , len ( fileAuths ) )
for _ , auth := range fileAuths {
fileIDs = append ( fileIDs , auth . FileID ) // 假设 FileAuth 结构体中有 FileID 字段
}
resultFiles := DB . Where ( "id IN ?" , fileIDs ) . Find ( & files )
if resultFiles . Error != nil {
log . Printf ( "查询文件列表时出错, UserID: %d, FileType: %s, 错误信息: %v" , userID , fileType , resultFiles . Error )
return nil , nil
}
}
return fileAuths , files
2025-03-28 19:09:34 +08:00
}
// 通过文件名及用户id查询(文件名模糊查询),索引不生效查询较慢
func FindFileByUserFileName ( fileName string , userID int ) [ ] FileAuth {
var files [ ] FileAuth
if proto . Config . SERVER_SQL_LOG {
DB . Debug ( ) . Where ( "auth_id = ? and user_file_name LIKE ?" , userID , "%" + fileName + "%" ) . Find ( & files )
} else {
DB . Where ( "auth_id = ? and user_file_name LIKE ?" , userID , "%" + fileName + "%" ) . Find ( & files )
}
return files
}
// 删除文件
func DeleteFileAuthByID ( id int ) error {
var res * gorm . DB
if proto . Config . SERVER_SQL_LOG {
res = DB . Debug ( ) . Delete ( & FileAuth { } , id )
} else {
res = DB . Delete ( & FileAuth { } , id )
}
return res . Error
}
// 修改文件名(暂时只能改文件名)
func UpdateFileAuthByID ( id int , file FileAuth ) error {
var res * gorm . DB
if proto . Config . SERVER_SQL_LOG {
res = DB . Debug ( ) . Model ( & FileAuth { } ) . Where ( "id = ?" , id ) . Updates ( & file )
} else {
res = DB . Model ( & FileAuth { } ) . Where ( "id = ?" , id ) . Updates ( & file )
}
return res . Error
}
// 根据FileAuth的id查询
func FindFileAuthByID ( id int ) FileAuth {
var file FileAuth
if proto . Config . SERVER_SQL_LOG {
DB . Debug ( ) . Where ( "id = ?" , id ) . First ( & file )
} else {
DB . Where ( "id = ?" , id ) . First ( & file )
}
return file
}
2025-03-30 16:38:09 +08:00
// 获取用户文件占用空间
type UserFileSpace struct {
TotalSize int ` gorm:"column:total_size" `
}
func GetUserFileSpace ( userID int ) UserFileSpace {
var space UserFileSpace
if proto . Config . SERVER_SQL_LOG {
DB . Debug ( ) . Raw ( "SELECT SUM(file_size) as total_size FROM file_auths left join files on file_auths.file_id = files.id where file_auths.auth_id=? AND file_auths.deleted_at IS NULL" , userID ) . Scan ( & space )
} else {
DB . Raw ( "SELECT SUM(file_size) as total_size FROM file_auths left join files on file_auths.file_id = files.id where file_auths.auth_id= ? AND file_auths.deleted_at IS NULL " , userID ) . Scan ( & space )
}
return space
}
2025-04-05 13:57:15 +08:00
func FindFileAuthByName ( fileName string , userID int ) FileAuth {
var file FileAuth
var db2 * gorm . DB
if proto . Config . SERVER_SQL_LOG {
db2 = DB . Debug ( )
} else {
db2 = DB
}
db2 . Where ( "user_file_name = ? and auth_id = ?" , fileName , userID ) . First ( & file )
return file
}