mirror of https://github.com/Xhofe/alist
				
				
				
			
		
			
				
	
	
		
			164 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Go
		
	
	
			
		
		
	
	
			164 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Go
		
	
	
package teambition
 | 
						|
 | 
						|
import (
 | 
						|
	"context"
 | 
						|
	"errors"
 | 
						|
	"github.com/alist-org/alist/v3/pkg/utils"
 | 
						|
	"net/http"
 | 
						|
 | 
						|
	"github.com/alist-org/alist/v3/drivers/base"
 | 
						|
	"github.com/alist-org/alist/v3/internal/driver"
 | 
						|
	"github.com/alist-org/alist/v3/internal/model"
 | 
						|
	"github.com/go-resty/resty/v2"
 | 
						|
)
 | 
						|
 | 
						|
type Teambition struct {
 | 
						|
	model.Storage
 | 
						|
	Addition
 | 
						|
}
 | 
						|
 | 
						|
func (d *Teambition) Config() driver.Config {
 | 
						|
	return config
 | 
						|
}
 | 
						|
 | 
						|
func (d *Teambition) GetAddition() driver.Additional {
 | 
						|
	return &d.Addition
 | 
						|
}
 | 
						|
 | 
						|
func (d *Teambition) Init(ctx context.Context) error {
 | 
						|
	_, err := d.request("/api/v2/roles", http.MethodGet, nil, nil)
 | 
						|
	return err
 | 
						|
}
 | 
						|
 | 
						|
func (d *Teambition) Drop(ctx context.Context) error {
 | 
						|
	return nil
 | 
						|
}
 | 
						|
 | 
						|
func (d *Teambition) List(ctx context.Context, dir model.Obj, args model.ListArgs) ([]model.Obj, error) {
 | 
						|
	return d.getFiles(dir.GetID())
 | 
						|
}
 | 
						|
 | 
						|
func (d *Teambition) Link(ctx context.Context, file model.Obj, args model.LinkArgs) (*model.Link, error) {
 | 
						|
	if u, ok := file.(model.URL); ok {
 | 
						|
		url := u.URL()
 | 
						|
		res, _ := base.NoRedirectClient.R().Get(url)
 | 
						|
		if res.StatusCode() == 302 {
 | 
						|
			url = res.Header().Get("location")
 | 
						|
		}
 | 
						|
		return &model.Link{URL: url}, nil
 | 
						|
	}
 | 
						|
	return nil, errors.New("can't convert obj to URL")
 | 
						|
}
 | 
						|
 | 
						|
func (d *Teambition) MakeDir(ctx context.Context, parentDir model.Obj, dirName string) error {
 | 
						|
	data := base.Json{
 | 
						|
		"objectType":     "collection",
 | 
						|
		"_projectId":     d.ProjectID,
 | 
						|
		"_creatorId":     "",
 | 
						|
		"created":        "",
 | 
						|
		"updated":        "",
 | 
						|
		"title":          dirName,
 | 
						|
		"color":          "blue",
 | 
						|
		"description":    "",
 | 
						|
		"workCount":      0,
 | 
						|
		"collectionType": "",
 | 
						|
		"recentWorks":    []interface{}{},
 | 
						|
		"_parentId":      parentDir.GetID(),
 | 
						|
		"subCount":       nil,
 | 
						|
	}
 | 
						|
	_, err := d.request("/api/collections", http.MethodPost, func(req *resty.Request) {
 | 
						|
		req.SetBody(data)
 | 
						|
	}, nil)
 | 
						|
	return err
 | 
						|
}
 | 
						|
 | 
						|
func (d *Teambition) Move(ctx context.Context, srcObj, dstDir model.Obj) error {
 | 
						|
	pre := "/api/works/"
 | 
						|
	if srcObj.IsDir() {
 | 
						|
		pre = "/api/collections/"
 | 
						|
	}
 | 
						|
	_, err := d.request(pre+srcObj.GetID()+"/move", http.MethodPut, func(req *resty.Request) {
 | 
						|
		req.SetBody(base.Json{
 | 
						|
			"_parentId": dstDir.GetID(),
 | 
						|
		})
 | 
						|
	}, nil)
 | 
						|
	return err
 | 
						|
}
 | 
						|
 | 
						|
func (d *Teambition) Rename(ctx context.Context, srcObj model.Obj, newName string) error {
 | 
						|
	pre := "/api/works/"
 | 
						|
	data := base.Json{
 | 
						|
		"fileName": newName,
 | 
						|
	}
 | 
						|
	if srcObj.IsDir() {
 | 
						|
		pre = "/api/collections/"
 | 
						|
		data = base.Json{
 | 
						|
			"title": newName,
 | 
						|
		}
 | 
						|
	}
 | 
						|
	_, err := d.request(pre+srcObj.GetID(), http.MethodPut, func(req *resty.Request) {
 | 
						|
		req.SetBody(data)
 | 
						|
	}, nil)
 | 
						|
	return err
 | 
						|
}
 | 
						|
 | 
						|
func (d *Teambition) Copy(ctx context.Context, srcObj, dstDir model.Obj) error {
 | 
						|
	pre := "/api/works/"
 | 
						|
	if srcObj.IsDir() {
 | 
						|
		pre = "/api/collections/"
 | 
						|
	}
 | 
						|
	_, err := d.request(pre+srcObj.GetID()+"/fork", http.MethodPut, func(req *resty.Request) {
 | 
						|
		req.SetBody(base.Json{
 | 
						|
			"_parentId": dstDir.GetID(),
 | 
						|
		})
 | 
						|
	}, nil)
 | 
						|
	return err
 | 
						|
}
 | 
						|
 | 
						|
func (d *Teambition) Remove(ctx context.Context, obj model.Obj) error {
 | 
						|
	pre := "/api/works/"
 | 
						|
	if obj.IsDir() {
 | 
						|
		pre = "/api/collections/"
 | 
						|
	}
 | 
						|
	_, err := d.request(pre+obj.GetID()+"/archive", http.MethodPost, nil, nil)
 | 
						|
	return err
 | 
						|
}
 | 
						|
 | 
						|
func (d *Teambition) Put(ctx context.Context, dstDir model.Obj, stream model.FileStreamer, up driver.UpdateProgress) error {
 | 
						|
	if d.UseS3UploadMethod {
 | 
						|
		return d.newUpload(ctx, dstDir, stream, up)
 | 
						|
	}
 | 
						|
	var (
 | 
						|
		token string
 | 
						|
		err   error
 | 
						|
	)
 | 
						|
	if d.isInternational() {
 | 
						|
		res, err := d.request("/projects", http.MethodGet, nil, nil)
 | 
						|
		if err != nil {
 | 
						|
			return err
 | 
						|
		}
 | 
						|
		token = getBetweenStr(string(res), "strikerAuth":"", "","phoneForLogin")
 | 
						|
	} else {
 | 
						|
		res, err := d.request("/api/v2/users/me", http.MethodGet, nil, nil)
 | 
						|
		if err != nil {
 | 
						|
			return err
 | 
						|
		}
 | 
						|
		token = utils.Json.Get(res, "strikerAuth").ToString()
 | 
						|
	}
 | 
						|
	var newFile *FileUpload
 | 
						|
	if stream.GetSize() <= 20971520 {
 | 
						|
		// post upload
 | 
						|
		newFile, err = d.upload(ctx, stream, token, up)
 | 
						|
	} else {
 | 
						|
		// chunk upload
 | 
						|
		//err = base.ErrNotImplement
 | 
						|
		newFile, err = d.chunkUpload(ctx, stream, token, up)
 | 
						|
	}
 | 
						|
	if err != nil {
 | 
						|
		return err
 | 
						|
	}
 | 
						|
	return d.finishUpload(newFile, dstDir.GetID())
 | 
						|
}
 | 
						|
 | 
						|
var _ driver.Driver = (*Teambition)(nil)
 |