mirror of
https://github.com/tgdrive/teldrive.git
synced 2025-01-06 23:28:43 +08:00
fix errors
This commit is contained in:
parent
c0d54e42ce
commit
3a7d0de1cc
15 changed files with 112 additions and 117 deletions
|
@ -11,8 +11,6 @@ func InitRouter() *gin.Engine {
|
|||
|
||||
r := gin.Default()
|
||||
|
||||
r.Use(gin.Logger())
|
||||
|
||||
r.Use(middleware.Cors())
|
||||
|
||||
c := controller.NewController()
|
||||
|
|
|
@ -4,14 +4,12 @@ import (
|
|||
"fmt"
|
||||
"mime"
|
||||
"path/filepath"
|
||||
"time"
|
||||
|
||||
"github.com/divyam234/teldrive/api"
|
||||
"github.com/divyam234/teldrive/internal/cron"
|
||||
"github.com/divyam234/teldrive/internal/logger"
|
||||
"github.com/divyam234/teldrive/internal/utils"
|
||||
"github.com/divyam234/teldrive/pkg/database"
|
||||
"github.com/go-co-op/gocron"
|
||||
|
||||
cnf "github.com/divyam234/teldrive/config"
|
||||
"github.com/divyam234/teldrive/internal/cache"
|
||||
|
@ -30,13 +28,7 @@ func main() {
|
|||
|
||||
cache.InitCache()
|
||||
|
||||
scheduler := gocron.NewScheduler(time.UTC)
|
||||
|
||||
scheduler.Every(1).Hour().Do(cron.FilesDeleteJob)
|
||||
|
||||
scheduler.Every(12).Hour().Do(cron.UploadCleanJob)
|
||||
|
||||
scheduler.StartAsync()
|
||||
cron.StartCronJobs()
|
||||
|
||||
mime.AddExtensionType(".js", "application/javascript")
|
||||
|
||||
|
|
1
go.mod
1
go.mod
|
@ -18,7 +18,6 @@ require (
|
|||
github.com/thoas/go-funk v0.9.3
|
||||
go.etcd.io/bbolt v1.3.8
|
||||
go.uber.org/zap v1.26.0
|
||||
golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb
|
||||
golang.org/x/time v0.5.0
|
||||
gorm.io/driver/postgres v1.5.4
|
||||
gorm.io/gorm v1.25.5
|
||||
|
|
4
go.sum
4
go.sum
|
@ -284,8 +284,8 @@ golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8U
|
|||
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY=
|
||||
golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
|
||||
golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb h1:mIKbk8weKhSeLH2GmUTrvx8CjkyJmnU1wFmg59CUjFA=
|
||||
golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc=
|
||||
golang.org/x/exp v0.0.0-20230116083435-1de6713980de h1:DBWn//IJw30uYCgERoxCg84hWtA97F4wMiKOIh00Uf0=
|
||||
golang.org/x/exp v0.0.0-20230116083435-1de6713980de/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc=
|
||||
golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0=
|
||||
golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
|
|
|
@ -12,6 +12,7 @@ import (
|
|||
"github.com/divyam234/teldrive/pkg/database"
|
||||
"github.com/divyam234/teldrive/pkg/models"
|
||||
"github.com/divyam234/teldrive/pkg/services"
|
||||
"github.com/go-co-op/gocron"
|
||||
"github.com/gotd/td/tg"
|
||||
)
|
||||
|
||||
|
@ -150,7 +151,7 @@ func cleanUploadsMessages(ctx context.Context, result UploadResult) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func FilesDeleteJob() {
|
||||
func filesDeleteJob() {
|
||||
db := database.DB
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
|
||||
|
@ -173,7 +174,7 @@ func FilesDeleteJob() {
|
|||
}
|
||||
}
|
||||
|
||||
func UploadCleanJob() {
|
||||
func uploadCleanJob() {
|
||||
db := database.DB
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
config := cnf.GetConfig()
|
||||
|
@ -194,3 +195,19 @@ func UploadCleanJob() {
|
|||
cleanUploadsMessages(ctx, row)
|
||||
}
|
||||
}
|
||||
|
||||
func folderSizeUpdate() {
|
||||
database.DB.Exec("call teldrive.update_size();")
|
||||
}
|
||||
|
||||
func StartCronJobs() {
|
||||
scheduler := gocron.NewScheduler(time.UTC)
|
||||
|
||||
scheduler.Every(1).Hour().Do(filesDeleteJob)
|
||||
|
||||
scheduler.Every(12).Hour().Do(uploadCleanJob)
|
||||
|
||||
scheduler.Every(2).Hour().Do(folderSizeUpdate)
|
||||
|
||||
scheduler.StartAsync()
|
||||
}
|
||||
|
|
|
@ -8,25 +8,9 @@ import (
|
|||
|
||||
"reflect"
|
||||
|
||||
"golang.org/x/exp/constraints"
|
||||
|
||||
"unicode"
|
||||
)
|
||||
|
||||
func Max[T constraints.Ordered](a, b T) T {
|
||||
if a > b {
|
||||
return a
|
||||
}
|
||||
return b
|
||||
}
|
||||
|
||||
func Min[T constraints.Ordered](a, b T) T {
|
||||
if a > b {
|
||||
return b
|
||||
}
|
||||
return a
|
||||
}
|
||||
|
||||
func CamelToPascalCase(input string) string {
|
||||
var result strings.Builder
|
||||
upperNext := true
|
||||
|
|
|
@ -29,16 +29,15 @@ CREATE TABLE IF NOT EXISTS teldrive.users (
|
|||
|
||||
|
||||
CREATE TABLE IF NOT EXISTS teldrive.uploads (
|
||||
id text NOT NULL DEFAULT teldrive.generate_uid(16) PRIMARY KEY,
|
||||
upload_id text NOT NULL,
|
||||
"name" text NOT NULL,
|
||||
user_id bigint,
|
||||
part_no int NOT NULL,
|
||||
part_id int NOT NULL,
|
||||
total_parts int NOT NULL,
|
||||
channel_id bigint NOT NULL,
|
||||
"size" bigint NOT NULL,
|
||||
created_at timestamp DEFAULT timezone('utc'::text, now())
|
||||
created_at timestamp DEFAULT timezone('utc'::text, now()),
|
||||
PRIMARY KEY(upload_id, part_no),
|
||||
);
|
||||
|
||||
|
||||
|
@ -88,7 +87,7 @@ DROP INDEX IF EXISTS parent_name_numeric_idx ;
|
|||
DROP INDEX IF EXISTS path_idx ;
|
||||
DROP INDEX IF EXISTS starred_updated_at_idx ;
|
||||
DROP INDEX IF EXISTS status_idx ;
|
||||
DROP UNIQUE IF EXISTS INDEX unique_file;
|
||||
DROP INDEX IF EXISTS unique_file;
|
||||
DROP INDEX IF EXISTS user_id_idx;
|
||||
|
||||
DROP TABLE IF EXISTS teldrive.files;
|
||||
|
|
|
@ -8,7 +8,7 @@ DECLARE
|
|||
BEGIN
|
||||
FOR rec IN
|
||||
SELECT id
|
||||
FROM files
|
||||
FROM teldrive.files
|
||||
WHERE type = 'folder'
|
||||
ORDER BY depth DESC
|
||||
LOOP
|
||||
|
@ -26,43 +26,56 @@ END;
|
|||
$$;
|
||||
|
||||
|
||||
CREATE OR REPLACE PROCEDURE teldrive.delete_files(IN file_ids TEXT[], IN op TEXT DEFAULT 'bulk') LANGUAGE PLPGSQL AS $$
|
||||
CREATE OR REPLACE PROCEDURE teldrive.delete_files(
|
||||
IN file_ids TEXT[],
|
||||
IN op TEXT DEFAULT 'bulk'
|
||||
) LANGUAGE plpgsql
|
||||
AS $$
|
||||
DECLARE
|
||||
rec RECORD;
|
||||
rec RECORD;
|
||||
BEGIN
|
||||
IF op = 'bulk' THEN
|
||||
FOR rec IN
|
||||
SELECT id, type
|
||||
FROM teldrive.files
|
||||
WHERE id = ANY (file_ids)
|
||||
LOOP
|
||||
IF rec.type = 'folder' THEN
|
||||
CALL teldrive.delete_files(ARRAY[rec.id], 'single');
|
||||
END IF;
|
||||
IF op = 'bulk' THEN
|
||||
FOR rec IN
|
||||
SELECT
|
||||
id,
|
||||
type
|
||||
FROM
|
||||
teldrive.files
|
||||
WHERE
|
||||
id = ANY (file_ids)
|
||||
LOOP
|
||||
IF rec.type = 'folder' THEN
|
||||
CALL teldrive.delete_files(ARRAY[rec.id], 'single');
|
||||
DELETE FROM teldrive.files WHERE id = rec.id;
|
||||
ELSE
|
||||
UPDATE teldrive.files SET status = 'pending_deletion' WHERE id = rec.id;
|
||||
|
||||
DELETE FROM teldrive.files
|
||||
WHERE id = rec.id;
|
||||
END LOOP;
|
||||
ELSE
|
||||
FOR rec IN
|
||||
SELECT id, type
|
||||
FROM teldrive.files
|
||||
WHERE parent_id = file_ids[1]
|
||||
LOOP
|
||||
IF rec.type = 'folder' THEN
|
||||
CALL teldrive.delete_files(ARRAY[rec.id], 'single');
|
||||
END IF;
|
||||
|
||||
DELETE FROM teldrive.files
|
||||
WHERE id = rec.id;
|
||||
END LOOP;
|
||||
END IF;
|
||||
END IF;
|
||||
END LOOP;
|
||||
ELSE
|
||||
FOR rec IN
|
||||
SELECT
|
||||
id,
|
||||
type
|
||||
FROM
|
||||
teldrive.files
|
||||
WHERE
|
||||
parent_id = file_ids[1]
|
||||
LOOP
|
||||
IF rec.type = 'folder' THEN
|
||||
CALL teldrive.delete_files(ARRAY[rec.id], 'single');
|
||||
DELETE FROM teldrive.files WHERE id = rec.id;
|
||||
ELSE
|
||||
UPDATE teldrive.files SET status = 'pending_deletion' WHERE id = rec.id;
|
||||
END IF;
|
||||
END LOOP;
|
||||
END IF;
|
||||
END;
|
||||
$$;
|
||||
|
||||
|
||||
CREATE OR REPLACE FUNCTION teldrive.create_directories(
|
||||
IN tg_id BIGINT,
|
||||
IN u_id BIGINT,
|
||||
IN long_path TEXT
|
||||
) RETURNS SETOF teldrive.files AS $$
|
||||
DECLARE
|
||||
|
@ -80,7 +93,7 @@ BEGIN
|
|||
|
||||
SELECT id INTO current_directory_id
|
||||
FROM teldrive.files
|
||||
WHERE parent_id = 'root' AND user_id = tg_id;
|
||||
WHERE parent_id = 'root' AND user_id = u_id;
|
||||
|
||||
FOR directory_name IN SELECT unnest(path_parts) LOOP
|
||||
path_so_far := CONCAT(path_so_far, '/', directory_name);
|
||||
|
@ -90,11 +103,11 @@ BEGIN
|
|||
FROM teldrive.files
|
||||
WHERE parent_id = current_directory_id
|
||||
AND "name" = directory_name
|
||||
AND "user_id" = tg_id;
|
||||
AND "user_id" = u_id;
|
||||
|
||||
IF new_directory_id IS NULL THEN
|
||||
INSERT INTO teldrive.files ("name", "type", mime_type, parent_id, "user_id", starred, "depth", "path")
|
||||
VALUES (directory_name, 'folder', 'teldrive/folder', current_directory_id, tg_id, false, depth_dir, path_so_far)
|
||||
VALUES (directory_name, 'folder', 'drive/folder', current_directory_id, u_id, false, depth_dir, path_so_far)
|
||||
RETURNING id INTO new_directory_id;
|
||||
END IF;
|
||||
|
||||
|
@ -234,20 +247,21 @@ $$ LANGUAGE plpgsql;
|
|||
|
||||
CREATE OR REPLACE FUNCTION teldrive.account_stats(
|
||||
IN u_id BIGINT
|
||||
) RETURNS TABLE (total_size BIGINT, total_files BIGINT, ch_id BIGINT,ch_name TEXT ) AS $$
|
||||
) RETURNS TABLE (total_size BIGINT, total_files BIGINT, channel_id BIGINT, channel_name TEXT ) AS $$
|
||||
DECLARE
|
||||
total_size BIGINT;
|
||||
total_files BIGINT;
|
||||
ch_id BIGINT;
|
||||
ch_name TEXT;
|
||||
channel_id BIGINT;
|
||||
channel_name TEXT;
|
||||
BEGIN
|
||||
SELECT COUNT(*), SUM(size) into total_files,total_size FROM teldrive.files WHERE user_id=u_id AND type= 'file' and status='active';
|
||||
SELECT channel_id ,channel_name into ch_id,ch_name FROM teldrive.channels WHERE selected=TRUE AND user_id=u_id;
|
||||
RETURN QUERY SELECT total_size,total_files,ch_id,ch_name;
|
||||
SELECT COUNT(*), coalesce(SUM(size),0) into total_files,total_size FROM teldrive.files WHERE user_id=u_id AND type= 'file' and status='active';
|
||||
SELECT c.channel_id ,c.channel_name into channel_id, channel_name FROM teldrive.channels c WHERE selected=TRUE AND user_id=u_id;
|
||||
RETURN QUERY SELECT total_size,total_files,channel_id,channel_name;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
|
||||
|
||||
-- +goose StatementEnd
|
||||
|
||||
-- +goose Down
|
||||
|
|
|
@ -11,6 +11,6 @@ func NewError(ctx *gin.Context, status int, err error) {
|
|||
}
|
||||
|
||||
type HTTPError struct {
|
||||
Code int `json:"code" example:"400"`
|
||||
Message string `json:"message" example:"status bad request"`
|
||||
Code int `json:"code"`
|
||||
Message string `json:"message"`
|
||||
}
|
||||
|
|
|
@ -40,7 +40,6 @@ func ToFileOutFull(file models.File) *schemas.FileOutFull {
|
|||
|
||||
func ToUploadOut(in *models.Upload) *schemas.UploadPartOut {
|
||||
out := &schemas.UploadPartOut{
|
||||
ID: in.ID,
|
||||
Name: in.Name,
|
||||
PartId: in.PartId,
|
||||
ChannelID: in.ChannelID,
|
||||
|
|
|
@ -5,14 +5,12 @@ import (
|
|||
)
|
||||
|
||||
type Upload struct {
|
||||
ID string `gorm:"type:text;primary_key;default:generate_uid(16)"`
|
||||
UploadId string `gorm:"type:text"`
|
||||
UserId int64 `gorm:"type:bigint"`
|
||||
Name string `gorm:"type:text"`
|
||||
PartNo int `gorm:"type:integer"`
|
||||
TotalParts int `gorm:"type:integer"`
|
||||
PartId int `gorm:"type:integer"`
|
||||
ChannelID int64 `gorm:"type:bigint"`
|
||||
Size int64 `gorm:"type:bigint"`
|
||||
CreatedAt time.Time `gorm:"default:timezone('utc'::text, now())"`
|
||||
UploadId string `gorm:"type:text"`
|
||||
UserId int64 `gorm:"type:bigint"`
|
||||
Name string `gorm:"type:text"`
|
||||
PartNo int `gorm:"type:integer"`
|
||||
PartId int `gorm:"type:integer"`
|
||||
ChannelID int64 `gorm:"type:bigint"`
|
||||
Size int64 `gorm:"type:bigint"`
|
||||
CreatedAt time.Time `gorm:"default:timezone('utc'::text, now())"`
|
||||
}
|
||||
|
|
|
@ -1,10 +1,9 @@
|
|||
package schemas
|
||||
|
||||
type UploadQuery struct {
|
||||
Filename string `form:"fileName"`
|
||||
PartNo int `form:"partNo,omitempty"`
|
||||
TotalParts int `form:"totalparts"`
|
||||
ChannelID int64 `form:"channelId"`
|
||||
Filename string `form:"fileName" binding:"required`
|
||||
PartNo int `form:"partNo" binding:"required`
|
||||
ChannelID int64 `form:"channelId" binding:"required`
|
||||
}
|
||||
|
||||
type UploadPartOut struct {
|
||||
|
|
|
@ -1,13 +1,12 @@
|
|||
package schemas
|
||||
|
||||
type AccountStats struct {
|
||||
TotalSize int64 `json:"totalSize"`
|
||||
TotalFiles int64 `json:"totalFiles"`
|
||||
ChId int64 `json:"channelId,omitempty"`
|
||||
ChName string `json:"channelName,omitempty"`
|
||||
}
|
||||
|
||||
type Channel struct {
|
||||
ChannelID int64 `json:"channelId"`
|
||||
ChannelName string `json:"channelName"`
|
||||
}
|
||||
|
||||
type AccountStats struct {
|
||||
TotalSize int64 `json:"totalSize"`
|
||||
TotalFiles int64 `json:"totalFiles"`
|
||||
Channel
|
||||
}
|
||||
|
|
|
@ -575,7 +575,7 @@ func (fs *FileService) GetFileStream(c *gin.Context) {
|
|||
channelUser = strconv.FormatInt(session.UserId, 10)
|
||||
} else {
|
||||
var index int
|
||||
limit := utils.Min(len(tokens), config.BgBotsLimit)
|
||||
limit := min(len(tokens), config.BgBotsLimit)
|
||||
|
||||
tgc.StreamWorkers.Set(tokens[:limit], file.ChannelID)
|
||||
|
||||
|
|
|
@ -65,14 +65,13 @@ func (us *UploadService) CreateUploadPart(c *gin.Context) (*schemas.UploadPartOu
|
|||
}
|
||||
|
||||
partUpload := &models.Upload{
|
||||
Name: payload.Name,
|
||||
UploadId: payload.UploadId,
|
||||
PartId: payload.PartId,
|
||||
ChannelID: payload.ChannelID,
|
||||
Size: payload.Size,
|
||||
PartNo: payload.PartNo,
|
||||
TotalParts: 1,
|
||||
UserId: userId,
|
||||
Name: payload.Name,
|
||||
UploadId: payload.UploadId,
|
||||
PartId: payload.PartId,
|
||||
ChannelID: payload.ChannelID,
|
||||
Size: payload.Size,
|
||||
PartNo: payload.PartNo,
|
||||
UserId: userId,
|
||||
}
|
||||
|
||||
if err := us.Db.Create(partUpload).Error; err != nil {
|
||||
|
@ -97,7 +96,6 @@ func (us *UploadService) UploadFile(c *gin.Context) (*schemas.UploadPartOut, *ty
|
|||
)
|
||||
|
||||
uploadQuery.PartNo = 1
|
||||
uploadQuery.TotalParts = 1
|
||||
|
||||
if err := c.ShouldBindQuery(&uploadQuery); err != nil {
|
||||
return nil, &types.AppError{Error: err, Code: http.StatusBadRequest}
|
||||
|
@ -191,14 +189,13 @@ func (us *UploadService) UploadFile(c *gin.Context) (*schemas.UploadPartOut, *ty
|
|||
}
|
||||
|
||||
partUpload := &models.Upload{
|
||||
Name: fileName,
|
||||
UploadId: uploadId,
|
||||
PartId: message.ID,
|
||||
ChannelID: channelId,
|
||||
Size: fileSize,
|
||||
PartNo: uploadQuery.PartNo,
|
||||
TotalParts: uploadQuery.TotalParts,
|
||||
UserId: userId,
|
||||
Name: fileName,
|
||||
UploadId: uploadId,
|
||||
PartId: message.ID,
|
||||
ChannelID: channelId,
|
||||
Size: fileSize,
|
||||
PartNo: uploadQuery.PartNo,
|
||||
UserId: userId,
|
||||
}
|
||||
|
||||
if err := us.Db.Create(partUpload).Error; err != nil {
|
||||
|
|
Loading…
Reference in a new issue