2023-07-13 23:00:40 +00:00
|
|
|
|
package gdisk
|
2022-07-28 15:00:43 +00:00
|
|
|
|
|
|
|
|
|
import (
|
2023-04-03 18:27:15 +00:00
|
|
|
|
"bytes"
|
2022-07-28 15:00:43 +00:00
|
|
|
|
"context"
|
2022-08-10 13:53:34 +00:00
|
|
|
|
"fmt"
|
2023-07-13 23:00:40 +00:00
|
|
|
|
"io"
|
2023-07-30 17:55:40 +00:00
|
|
|
|
"log"
|
2023-07-13 23:00:40 +00:00
|
|
|
|
"net/http"
|
|
|
|
|
"os"
|
|
|
|
|
"strings"
|
|
|
|
|
|
2023-07-30 17:55:40 +00:00
|
|
|
|
"github.com/pkg/errors"
|
2022-07-28 15:00:43 +00:00
|
|
|
|
"golang.org/x/oauth2"
|
|
|
|
|
"golang.org/x/oauth2/google"
|
|
|
|
|
"google.golang.org/api/drive/v3"
|
|
|
|
|
"google.golang.org/api/option"
|
2024-12-16 09:17:48 +00:00
|
|
|
|
"gitea.pena/PenaSide/docxTemplater/tools"
|
2022-07-28 15:00:43 +00:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
const (
|
2023-08-17 08:12:22 +00:00
|
|
|
|
DefaultDir = "TemplateGenerator"
|
|
|
|
|
TemplateDir = "templates"
|
|
|
|
|
SaveDir = "saved"
|
|
|
|
|
MimeTypeDocx = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
|
|
|
|
|
MimeTypeGoogle = "application/vnd.google-apps.document"
|
2022-07-28 15:00:43 +00:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type Client struct {
|
|
|
|
|
App *ClientApp
|
|
|
|
|
HTTPClient *http.Client
|
|
|
|
|
Service *drive.Service
|
|
|
|
|
Token *oauth2.Token
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type ClientApp struct {
|
|
|
|
|
Config *oauth2.Config
|
|
|
|
|
}
|
|
|
|
|
|
2022-08-11 20:32:10 +00:00
|
|
|
|
func NewClientApp(credentials string) (*ClientApp, error) {
|
2022-10-21 20:38:31 +00:00
|
|
|
|
b, err := os.ReadFile(credentials)
|
2022-07-28 15:00:43 +00:00
|
|
|
|
if err != nil {
|
2023-07-30 17:55:40 +00:00
|
|
|
|
return nil, errors.Wrap(err, "NewClientApp.ReadFile")
|
2022-07-28 15:00:43 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
config, err := google.ConfigFromJSON(b,
|
|
|
|
|
drive.DriveScope,
|
2022-11-24 19:37:47 +00:00
|
|
|
|
drive.DriveMetadataScope,
|
2022-07-28 15:00:43 +00:00
|
|
|
|
)
|
|
|
|
|
if err != nil {
|
2023-07-30 17:55:40 +00:00
|
|
|
|
return nil, errors.Wrap(err, "NewClientApp.ConfigFromJSON")
|
2022-07-28 15:00:43 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return &ClientApp{Config: config}, nil
|
|
|
|
|
}
|
|
|
|
|
|
2023-09-06 10:13:15 +00:00
|
|
|
|
func (ca *ClientApp) GenerateOAuthURL(amoID, penaID, redirectURL string) (string, error) {
|
2023-07-13 23:00:40 +00:00
|
|
|
|
state, err := tools.EncryptTokenAES(tools.StateToken{
|
2023-09-06 13:01:46 +00:00
|
|
|
|
AmoID: amoID,
|
2023-08-02 17:30:06 +00:00
|
|
|
|
PenaID: penaID,
|
2022-10-11 10:07:29 +00:00
|
|
|
|
Service: "google",
|
2023-07-13 23:00:40 +00:00
|
|
|
|
RedirectURL: redirectURL,
|
2022-10-11 10:07:29 +00:00
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
2023-07-30 17:55:40 +00:00
|
|
|
|
return "", errors.Wrap(err, "GenerateOAuthURL.Encrypt")
|
2022-10-11 10:07:29 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-11-12 10:24:48 +00:00
|
|
|
|
return ca.Config.AuthCodeURL(state, oauth2.AccessTypeOffline, oauth2.ApprovalForce), nil
|
2022-07-28 15:00:43 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-09-15 13:53:55 +00:00
|
|
|
|
func (ca *ClientApp) RefreshToken(ctx context.Context, oldToken *oauth2.Token) (*oauth2.Token, error) {
|
|
|
|
|
token, err := ca.Config.TokenSource(ctx, oldToken).Token()
|
|
|
|
|
if err != nil {
|
2023-07-30 17:55:40 +00:00
|
|
|
|
return nil, errors.Wrap(err, "RefreshToken")
|
2022-09-15 13:53:55 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return token, nil
|
|
|
|
|
}
|
|
|
|
|
|
2022-08-10 13:53:34 +00:00
|
|
|
|
func (ca *ClientApp) NewClient(ctx context.Context, token *oauth2.Token) (*Client, error) {
|
|
|
|
|
client := ca.Config.Client(ctx, token)
|
2023-07-30 17:55:40 +00:00
|
|
|
|
service, err := drive.NewService(ctx, option.WithHTTPClient(client))
|
2022-07-28 15:00:43 +00:00
|
|
|
|
if err != nil {
|
2023-07-30 17:55:40 +00:00
|
|
|
|
return nil, errors.Wrap(err, "NewClient.NewService")
|
2022-07-28 15:00:43 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return &Client{
|
|
|
|
|
App: ca,
|
|
|
|
|
HTTPClient: client,
|
2023-07-30 17:55:40 +00:00
|
|
|
|
Service: service,
|
2022-08-10 13:53:34 +00:00
|
|
|
|
Token: token,
|
2022-07-28 15:00:43 +00:00
|
|
|
|
}, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (ca *ClientApp) GetToken(ctx context.Context, authCode string) (*oauth2.Token, error) {
|
|
|
|
|
return ca.Config.Exchange(ctx, authCode)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (c *Client) SetToken(token oauth2.Token) {
|
|
|
|
|
c.Token = &token
|
|
|
|
|
}
|
|
|
|
|
|
2023-07-13 23:00:40 +00:00
|
|
|
|
func (c *Client) GetDisk(ctx context.Context) {
|
2023-07-30 17:55:40 +00:00
|
|
|
|
service, err := drive.NewService(ctx, option.WithHTTPClient(c.HTTPClient))
|
2022-09-15 13:53:55 +00:00
|
|
|
|
|
|
|
|
|
if err != nil {
|
2023-07-30 17:55:40 +00:00
|
|
|
|
log.Println(errors.Wrap(err, "GetDisk.NewService"))
|
2022-09-15 13:53:55 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2023-07-30 17:55:40 +00:00
|
|
|
|
about, err := service.About.Get().Fields("storageQuota", "user", "exportFormats", "maxImportSizes", "maxUploadSize").Do()
|
2022-09-15 13:53:55 +00:00
|
|
|
|
if err != nil {
|
2023-07-30 17:55:40 +00:00
|
|
|
|
log.Println(errors.Wrap(err, "GetDisk.ServiceAboutGet"))
|
2022-09-15 13:53:55 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
fmt.Printf("srv.About %+v \r\n", about.User)
|
|
|
|
|
|
2023-07-30 17:55:40 +00:00
|
|
|
|
dl, err := service.Drives.List().Do()
|
2022-09-15 13:53:55 +00:00
|
|
|
|
if err != nil {
|
2023-07-30 17:55:40 +00:00
|
|
|
|
log.Println(errors.Wrap(err, "GetDisk.ServiceDriveListDo"))
|
2022-09-15 13:53:55 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fmt.Println("DRIVES ________________________")
|
|
|
|
|
for _, drive := range dl.Drives {
|
|
|
|
|
fmt.Println(drive)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-07-13 23:00:40 +00:00
|
|
|
|
// GetUserInfo - получить информацию о пользователе Google.
|
|
|
|
|
func (c *Client) GetUserInfo(ctx context.Context) (*drive.User, error) {
|
2023-07-30 17:55:40 +00:00
|
|
|
|
service, err := drive.NewService(ctx, option.WithHTTPClient(c.HTTPClient))
|
2022-09-15 13:53:55 +00:00
|
|
|
|
|
|
|
|
|
if err != nil {
|
2023-07-30 17:55:40 +00:00
|
|
|
|
return nil, errors.Wrap(err, "GetUserInfo.NewService")
|
2022-09-15 13:53:55 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-07-30 17:55:40 +00:00
|
|
|
|
about, err := service.About.Get().Fields("user").Do()
|
2022-09-15 13:53:55 +00:00
|
|
|
|
|
|
|
|
|
if err != nil {
|
2023-07-30 17:55:40 +00:00
|
|
|
|
return nil, errors.Wrap(err, "GetUserInfo.ServiceDo")
|
2022-09-15 13:53:55 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if about == nil {
|
2023-07-30 17:55:40 +00:00
|
|
|
|
return nil, errors.Wrap(errors.New("got empty about"), "GetUserInfo")
|
2022-09-15 13:53:55 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if about.User == nil {
|
2023-07-30 17:55:40 +00:00
|
|
|
|
return nil, errors.Wrap(errors.New("got empty about.User"), "GetUserInfo")
|
2022-09-15 13:53:55 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return about.User, nil
|
2022-07-28 15:00:43 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-07-13 23:00:40 +00:00
|
|
|
|
// GetResourcesByName - получить информацию о ресурсе.
|
2022-10-11 10:07:29 +00:00
|
|
|
|
func (c *Client) GetResourcesByName(name, parentID string) (*drive.FileList, error) {
|
2022-07-28 15:00:43 +00:00
|
|
|
|
query := "name = '" + name + "' and trashed = false"
|
|
|
|
|
|
|
|
|
|
if parentID != "" {
|
|
|
|
|
query += "and '" + parentID + "' in parents"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fl, err := c.Service.Files.List().
|
|
|
|
|
Q(query).
|
|
|
|
|
Do()
|
|
|
|
|
if err != nil {
|
2022-08-11 20:32:10 +00:00
|
|
|
|
if strings.Contains(err.Error(), "404") {
|
|
|
|
|
return nil, nil
|
|
|
|
|
}
|
2023-07-30 17:55:40 +00:00
|
|
|
|
return nil, errors.Wrap(err, "GetResourcesByName.ServiceFileListDo")
|
2022-07-28 15:00:43 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-10-11 10:07:29 +00:00
|
|
|
|
return fl, nil
|
2022-07-28 15:00:43 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-08-10 13:53:34 +00:00
|
|
|
|
// GetResources - получить список файлов и папок ресурса по его id
|
2023-07-13 23:00:40 +00:00
|
|
|
|
// Если id не указан, то принимается значение 'root'.
|
2022-10-11 10:07:29 +00:00
|
|
|
|
func (c *Client) GetResources(id string) (*drive.FileList, error) {
|
|
|
|
|
if id == "" {
|
|
|
|
|
id = "root"
|
|
|
|
|
}
|
2022-08-10 13:53:34 +00:00
|
|
|
|
query := fmt.Sprintf("trashed = false and '%v' in parents", id)
|
|
|
|
|
|
|
|
|
|
fl, err := c.Service.Files.List().
|
|
|
|
|
Q(query).
|
|
|
|
|
Do()
|
|
|
|
|
if err != nil {
|
2022-08-11 20:32:10 +00:00
|
|
|
|
if strings.Contains(err.Error(), "404") {
|
|
|
|
|
return nil, nil
|
|
|
|
|
}
|
2023-07-30 17:55:40 +00:00
|
|
|
|
return nil, errors.Wrap(err, "GetResources.ServiceFileListDo")
|
2022-08-10 13:53:34 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-10-11 10:07:29 +00:00
|
|
|
|
return fl, nil
|
2022-08-10 13:53:34 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-07-13 23:00:40 +00:00
|
|
|
|
// PutResources - создание папки.
|
2022-07-28 15:00:43 +00:00
|
|
|
|
func (c *Client) PutResources(name, parentID string) (*drive.File, error) {
|
2023-07-30 17:55:40 +00:00
|
|
|
|
queryFile := &drive.File{Name: name, MimeType: "application/vnd.google-apps.folder", IsAppAuthorized: true}
|
2022-08-11 20:32:10 +00:00
|
|
|
|
if parentID != "" {
|
2023-07-30 17:55:40 +00:00
|
|
|
|
queryFile.Parents = []string{parentID}
|
2022-08-11 20:32:10 +00:00
|
|
|
|
}
|
2023-07-30 17:55:40 +00:00
|
|
|
|
f, err := c.Service.Files.Create(queryFile).Do()
|
2022-07-28 15:00:43 +00:00
|
|
|
|
|
|
|
|
|
if err != nil {
|
2023-07-30 17:55:40 +00:00
|
|
|
|
return nil, errors.Wrap(err, "PutResources.ServiceFileListDo")
|
2022-07-28 15:00:43 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return f, nil
|
|
|
|
|
}
|
|
|
|
|
|
2022-10-11 10:07:29 +00:00
|
|
|
|
func (c *Client) DeleteResources(id string) error {
|
2023-07-30 17:55:40 +00:00
|
|
|
|
err := c.Service.Files.Delete(id).Do()
|
|
|
|
|
return errors.Wrap(err, "DeleteResources")
|
2022-10-11 10:07:29 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-07-13 23:00:40 +00:00
|
|
|
|
// UploadFile - отправить файл в диск.
|
2022-12-19 12:01:38 +00:00
|
|
|
|
func (c *Client) UploadFile(filepath, mimetype, parentID string) (string, string, error) {
|
2022-07-28 15:00:43 +00:00
|
|
|
|
file, err := os.Open(filepath)
|
2023-07-30 17:55:40 +00:00
|
|
|
|
defer func() {
|
|
|
|
|
if err = file.Close(); err != nil {
|
|
|
|
|
log.Println("ERROR", errors.Wrap(err, "UploadFile.FileClose"))
|
|
|
|
|
}
|
|
|
|
|
}()
|
2022-07-28 15:00:43 +00:00
|
|
|
|
|
|
|
|
|
if err != nil {
|
2023-07-30 17:55:40 +00:00
|
|
|
|
return "", "", errors.Wrap(err, "UploadFile.OsOpen")
|
2022-07-28 15:00:43 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
filename := strings.Split(file.Name(), "/")
|
|
|
|
|
|
2023-07-30 17:55:40 +00:00
|
|
|
|
queryFile := &drive.File{
|
2022-11-24 19:37:47 +00:00
|
|
|
|
Name: filename[len(filename)-1],
|
|
|
|
|
MimeType: mimetype,
|
|
|
|
|
IsAppAuthorized: true,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if parentID != "" {
|
2023-07-30 17:55:40 +00:00
|
|
|
|
queryFile.Parents = []string{parentID}
|
2022-07-28 15:00:43 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-07-30 17:55:40 +00:00
|
|
|
|
fileData, err := c.Service.Files.Create(queryFile).Media(file).Do()
|
2022-07-28 15:00:43 +00:00
|
|
|
|
|
|
|
|
|
if err != nil {
|
2023-07-30 17:55:40 +00:00
|
|
|
|
return "", "", errors.Wrap(err, "UploadFile.ServiceFilesCreate")
|
2022-07-28 15:00:43 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-12-19 12:01:38 +00:00
|
|
|
|
return fileData.Id, fileData.ExportLinks[mimetype], nil
|
2022-07-28 15:00:43 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-04-03 18:27:15 +00:00
|
|
|
|
func (c *Client) UploadFileBytes(file []byte, filename, mimetype, parentID string) (string, string, error) {
|
2023-07-30 17:55:40 +00:00
|
|
|
|
queryFile := &drive.File{
|
2023-04-03 18:27:15 +00:00
|
|
|
|
Name: filename,
|
|
|
|
|
MimeType: mimetype,
|
|
|
|
|
IsAppAuthorized: true,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if parentID != "" {
|
2023-07-30 17:55:40 +00:00
|
|
|
|
queryFile.Parents = []string{parentID}
|
2023-04-03 18:27:15 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-07-30 17:55:40 +00:00
|
|
|
|
fileData, err := c.Service.Files.Create(queryFile).Media(bytes.NewReader(file)).Do()
|
2023-04-03 18:27:15 +00:00
|
|
|
|
|
|
|
|
|
if err != nil {
|
2023-07-30 17:55:40 +00:00
|
|
|
|
return "", "", errors.Wrap(err, "UploadFileBytes.ServiceFilesCreateDo")
|
2023-04-03 18:27:15 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return fileData.Id, fileData.ExportLinks[mimetype], nil
|
|
|
|
|
}
|
|
|
|
|
|
2022-07-28 15:00:43 +00:00
|
|
|
|
func (c *Client) DownloadFile(filepath, fileID string) error {
|
2022-08-10 13:53:34 +00:00
|
|
|
|
file, err := c.Service.Files.Get(fileID).Do()
|
|
|
|
|
if err != nil {
|
2023-07-30 17:55:40 +00:00
|
|
|
|
return errors.Wrap(err, "DownloadFile.ServiceFilesGetDo")
|
2022-08-10 13:53:34 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var resp *http.Response
|
2023-04-03 18:27:15 +00:00
|
|
|
|
|
2023-08-17 08:12:22 +00:00
|
|
|
|
if file.MimeType == MimeTypeGoogle {
|
2022-11-24 19:37:47 +00:00
|
|
|
|
resp, err = c.Service.Files.Export(fileID, MimeTypeDocx).
|
2022-08-10 13:53:34 +00:00
|
|
|
|
Fields("exportFormat", "docx").
|
2023-07-30 17:55:40 +00:00
|
|
|
|
Download()
|
|
|
|
|
err = errors.Wrap(err, "DownloadFile.Export")
|
2022-08-10 13:53:34 +00:00
|
|
|
|
} else {
|
2023-07-30 17:55:40 +00:00
|
|
|
|
resp, err = c.Service.Files.Get(fileID).Download()
|
|
|
|
|
err = errors.Wrap(err, "DownloadFile.Download")
|
2022-08-10 13:53:34 +00:00
|
|
|
|
}
|
2022-07-28 15:00:43 +00:00
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
2023-07-30 17:55:40 +00:00
|
|
|
|
defer func() {
|
|
|
|
|
if err = resp.Body.Close(); err != nil {
|
|
|
|
|
log.Println("ERROR", errors.Wrap(err, "DownloadFile.BodyClose"))
|
|
|
|
|
}
|
|
|
|
|
}()
|
2022-08-10 13:53:34 +00:00
|
|
|
|
|
2022-07-28 15:00:43 +00:00
|
|
|
|
out, err := os.Create(filepath)
|
2023-07-13 23:00:40 +00:00
|
|
|
|
|
2023-07-30 17:55:40 +00:00
|
|
|
|
defer func() {
|
|
|
|
|
if err = out.Close(); err != nil {
|
|
|
|
|
log.Println("ERROR", errors.Wrap(err, "DownloadFile.OutFileClose"))
|
|
|
|
|
}
|
|
|
|
|
}()
|
2022-07-28 15:00:43 +00:00
|
|
|
|
|
|
|
|
|
if err != nil {
|
2023-07-30 17:55:40 +00:00
|
|
|
|
return errors.Wrap(err, "DownloadFile.OsCreate")
|
2022-07-28 15:00:43 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_, err = io.Copy(out, resp.Body)
|
|
|
|
|
if err != nil {
|
2023-07-30 17:55:40 +00:00
|
|
|
|
return errors.Wrap(err, "DownloadFile.IoCopy")
|
2022-07-28 15:00:43 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
2022-08-11 20:32:10 +00:00
|
|
|
|
|
2023-04-03 18:27:15 +00:00
|
|
|
|
func (c *Client) DownloadFileBytes(fileID string) ([]byte, error) {
|
|
|
|
|
file, err := c.Service.Files.Get(fileID).Do()
|
|
|
|
|
if err != nil {
|
2023-07-30 17:55:40 +00:00
|
|
|
|
return nil, errors.Wrap(err, "DownloadFileBytes.ServiceFilesGetDo")
|
2023-04-03 18:27:15 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var resp *http.Response
|
|
|
|
|
|
2023-08-17 08:12:22 +00:00
|
|
|
|
if file.MimeType == MimeTypeGoogle {
|
2023-07-30 17:55:40 +00:00
|
|
|
|
resp, err = c.Service.Files.Export(fileID, MimeTypeDocx).Fields("exportFormat", "docx").Download()
|
|
|
|
|
err = errors.Wrap(err, "DownloadFileBytes.Export")
|
|
|
|
|
defer func() {
|
|
|
|
|
if err = resp.Body.Close(); err != nil {
|
|
|
|
|
log.Println("ERROR", errors.Wrap(err, "DownloadFileBytes.BodyClose"))
|
|
|
|
|
}
|
|
|
|
|
}()
|
2023-04-03 18:27:15 +00:00
|
|
|
|
} else {
|
2023-07-30 17:55:40 +00:00
|
|
|
|
resp, err = c.Service.Files.Get(fileID).Download()
|
|
|
|
|
err = errors.Wrap(err, "DownloadFileBytes.Download")
|
|
|
|
|
defer func() {
|
|
|
|
|
if err = resp.Body.Close(); err != nil {
|
|
|
|
|
log.Println("ERROR", errors.Wrap(err, "DownloadFileBytes.BodyClose"))
|
|
|
|
|
}
|
|
|
|
|
}()
|
2023-04-03 18:27:15 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
|
2023-07-30 17:55:40 +00:00
|
|
|
|
defer func() {
|
|
|
|
|
if err = resp.Body.Close(); err != nil {
|
|
|
|
|
log.Println("ERROR", errors.Wrap(err, "DownloadFile.BodyClose"))
|
|
|
|
|
}
|
|
|
|
|
}()
|
2023-04-03 18:27:15 +00:00
|
|
|
|
|
|
|
|
|
return io.ReadAll(resp.Body)
|
|
|
|
|
}
|
|
|
|
|
|
2022-08-11 20:32:10 +00:00
|
|
|
|
// MakeDefaultDirs - проверяет диск на наличие папок DefaultDir, TemplateDir и SaveDir.
|
2023-07-13 23:00:40 +00:00
|
|
|
|
// Если папки не существуют, то создает их.
|
|
|
|
|
func (c *Client) MakeDefaultDirs(defaultID, defaultName, templateID, templateName, saveID,
|
2022-10-11 10:07:29 +00:00
|
|
|
|
saveName string) (*drive.File, *drive.File, *drive.File, error) {
|
2022-08-11 20:32:10 +00:00
|
|
|
|
var defaultDir, templateDir, saveDir *drive.File
|
|
|
|
|
|
2022-10-11 10:07:29 +00:00
|
|
|
|
if defaultName == "" {
|
|
|
|
|
defaultName = DefaultDir
|
|
|
|
|
}
|
2022-08-11 20:32:10 +00:00
|
|
|
|
|
2022-10-11 10:07:29 +00:00
|
|
|
|
if templateName == "" {
|
|
|
|
|
templateName = TemplateDir
|
2022-08-11 20:32:10 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-10-11 10:07:29 +00:00
|
|
|
|
if saveName == "" {
|
|
|
|
|
saveName = SaveDir
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var err error
|
|
|
|
|
|
|
|
|
|
// Check Default directory
|
2023-07-13 23:00:40 +00:00
|
|
|
|
if defaultID == "" {
|
|
|
|
|
var fl *drive.FileList
|
|
|
|
|
fl, err = c.GetResourcesByName(defaultName, "")
|
2022-08-11 20:32:10 +00:00
|
|
|
|
if err != nil {
|
2023-07-30 17:55:40 +00:00
|
|
|
|
return nil, nil, nil, errors.Wrap(err, "MakeDefaultDirs.DefaultDir.GetResourceByName")
|
2022-10-11 10:07:29 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if len(fl.Files) == 0 {
|
|
|
|
|
defaultDir, err = c.PutResources(defaultName, "")
|
|
|
|
|
if err != nil {
|
2023-07-30 17:55:40 +00:00
|
|
|
|
return nil, nil, nil, errors.Wrap(err, "MakeDefaultDirs.DefaultDir.PutResource")
|
2022-10-11 10:07:29 +00:00
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
defaultDir = fl.Files[0]
|
2022-08-11 20:32:10 +00:00
|
|
|
|
}
|
|
|
|
|
} else {
|
2023-07-13 23:00:40 +00:00
|
|
|
|
defaultDir, err = c.Service.Files.Get(defaultID).Do()
|
2022-10-21 20:38:31 +00:00
|
|
|
|
if err != nil {
|
|
|
|
|
if strings.Contains(err.Error(), "404") {
|
|
|
|
|
defaultDir, err = c.PutResources(defaultName, "")
|
|
|
|
|
if err != nil {
|
2023-07-30 17:55:40 +00:00
|
|
|
|
return nil, nil, nil, errors.Wrap(err, "MakeDefaultDirs.DefaultDir.PutResource")
|
2022-10-21 20:38:31 +00:00
|
|
|
|
}
|
|
|
|
|
} else {
|
2023-07-30 17:55:40 +00:00
|
|
|
|
return nil, nil, nil, errors.Wrap(err, "MakeDefaultDirs.DefaultDir.ServiceFilesGetDo")
|
2022-10-11 10:07:29 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2022-08-11 20:32:10 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Check Template Directory
|
2023-07-13 23:00:40 +00:00
|
|
|
|
if templateID == "" {
|
|
|
|
|
var fl *drive.FileList
|
|
|
|
|
fl, err = c.GetResourcesByName(templateName, defaultDir.Id)
|
2022-08-11 20:32:10 +00:00
|
|
|
|
if err != nil {
|
2023-07-30 17:55:40 +00:00
|
|
|
|
return nil, nil, nil, errors.Wrap(err, "MakeDefaultDirs.TemplateDir.GetResourcesByName")
|
2022-08-11 20:32:10 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-10-11 10:07:29 +00:00
|
|
|
|
if len(fl.Files) == 0 {
|
|
|
|
|
templateDir, err = c.PutResources(templateName, defaultDir.Id)
|
2022-08-11 20:32:10 +00:00
|
|
|
|
if err != nil {
|
2023-07-30 17:55:40 +00:00
|
|
|
|
return nil, nil, nil, errors.Wrap(err, "MakeDefaultDirs.TemplateDir.PutResources")
|
2022-08-11 20:32:10 +00:00
|
|
|
|
}
|
|
|
|
|
} else {
|
2022-10-11 10:07:29 +00:00
|
|
|
|
templateDir = fl.Files[0]
|
2022-08-11 20:32:10 +00:00
|
|
|
|
}
|
|
|
|
|
} else {
|
2023-07-13 23:00:40 +00:00
|
|
|
|
templateDir, err = c.Service.Files.Get(templateID).Do()
|
2022-10-21 20:38:31 +00:00
|
|
|
|
if err != nil {
|
|
|
|
|
if strings.Contains(err.Error(), "404") {
|
|
|
|
|
templateDir, err = c.PutResources(templateName, defaultDir.Id)
|
|
|
|
|
if err != nil {
|
2023-07-30 17:55:40 +00:00
|
|
|
|
return nil, nil, nil, errors.Wrap(err, "MakeDefaultDirs.TemplateDir.PutResources")
|
2022-10-21 20:38:31 +00:00
|
|
|
|
}
|
|
|
|
|
} else {
|
2023-07-30 17:55:40 +00:00
|
|
|
|
return nil, nil, nil, errors.Wrap(err, "MakeDefaultDirs.TemplateDir.ServiceFilesGetDo")
|
2022-08-11 20:32:10 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Check Save Directory
|
2023-07-13 23:00:40 +00:00
|
|
|
|
if saveID == "" {
|
|
|
|
|
var fl *drive.FileList
|
|
|
|
|
fl, err = c.GetResourcesByName(saveName, defaultDir.Id)
|
2022-08-11 20:32:10 +00:00
|
|
|
|
if err != nil {
|
2023-07-30 17:55:40 +00:00
|
|
|
|
return nil, nil, nil, errors.Wrap(err, "MakeDefaultDirs.SaveDir.GetResourcesByName")
|
2022-08-11 20:32:10 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-10-11 10:07:29 +00:00
|
|
|
|
if len(fl.Files) == 0 {
|
|
|
|
|
saveDir, err = c.PutResources(saveName, defaultDir.Id)
|
2022-08-11 20:32:10 +00:00
|
|
|
|
if err != nil {
|
2023-07-30 17:55:40 +00:00
|
|
|
|
return nil, nil, nil, errors.Wrap(err, "MakeDefaultDirs.SaveDir.PutResources")
|
2022-08-11 20:32:10 +00:00
|
|
|
|
}
|
|
|
|
|
} else {
|
2022-10-11 10:07:29 +00:00
|
|
|
|
saveDir = fl.Files[0]
|
2022-08-11 20:32:10 +00:00
|
|
|
|
}
|
|
|
|
|
} else {
|
2023-07-13 23:00:40 +00:00
|
|
|
|
saveDir, err = c.Service.Files.Get(templateID).Do()
|
2022-10-21 20:38:31 +00:00
|
|
|
|
if err != nil {
|
|
|
|
|
if strings.Contains(err.Error(), "404") {
|
|
|
|
|
saveDir, err = c.PutResources(saveName, defaultDir.Id)
|
|
|
|
|
if err != nil {
|
2023-07-30 17:55:40 +00:00
|
|
|
|
return nil, nil, nil, errors.Wrap(err, "MakeDefaultDirs.SaveDir.PutResources")
|
2022-10-21 20:38:31 +00:00
|
|
|
|
}
|
|
|
|
|
} else {
|
2023-07-30 17:55:40 +00:00
|
|
|
|
return nil, nil, nil, errors.Wrap(err, "MakeDefaultDirs.SaveDir.ServiceFilesGetDo")
|
2022-08-11 20:32:10 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-10-11 10:07:29 +00:00
|
|
|
|
return defaultDir, templateDir, saveDir, nil
|
2022-08-11 20:32:10 +00:00
|
|
|
|
}
|