2022-07-28 15:00:43 +00:00
|
|
|
|
package handlers
|
|
|
|
|
|
|
|
|
|
import (
|
2022-08-10 13:53:34 +00:00
|
|
|
|
"errors"
|
2022-10-11 10:07:29 +00:00
|
|
|
|
"fmt"
|
2022-11-24 19:37:47 +00:00
|
|
|
|
"io"
|
2022-07-28 15:00:43 +00:00
|
|
|
|
"net/http"
|
2022-11-24 19:37:47 +00:00
|
|
|
|
"os"
|
2023-08-15 21:33:53 +00:00
|
|
|
|
|
|
|
|
|
"github.com/gorilla/schema"
|
|
|
|
|
"go.uber.org/zap"
|
|
|
|
|
"google.golang.org/api/drive/v3"
|
2022-12-31 14:46:28 +00:00
|
|
|
|
"penahub.gitlab.yandexcloud.net/backend/templategen/dal/model"
|
|
|
|
|
GDisk "penahub.gitlab.yandexcloud.net/backend/templategen/gdisk"
|
2023-08-15 21:33:53 +00:00
|
|
|
|
"penahub.gitlab.yandexcloud.net/backend/templategen/middleware"
|
2022-12-31 14:46:28 +00:00
|
|
|
|
"penahub.gitlab.yandexcloud.net/backend/templategen/templategen"
|
|
|
|
|
"penahub.gitlab.yandexcloud.net/backend/templategen/tools"
|
2022-07-28 15:00:43 +00:00
|
|
|
|
)
|
|
|
|
|
|
2022-09-15 13:53:55 +00:00
|
|
|
|
type ReqGDiskSaveToken struct {
|
2022-11-24 19:37:47 +00:00
|
|
|
|
State string `json:"state" schema:"state"`
|
|
|
|
|
Code string `json:"code" schema:"code"`
|
|
|
|
|
Scope string `json:"scope" schema:"scope"`
|
2022-07-28 15:00:43 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
// GDiskSaveToken - сохраняет токен авторизации.
|
2022-07-28 15:00:43 +00:00
|
|
|
|
func (h *Handlers) GDiskSaveToken(w http.ResponseWriter, r *http.Request) {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
var request ReqGDiskSaveToken
|
2022-07-28 15:00:43 +00:00
|
|
|
|
|
|
|
|
|
err := r.ParseForm()
|
|
|
|
|
if err != nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusBadRequest, err)
|
2022-07-28 15:00:43 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
err = schema.NewDecoder().Decode(&request, r.Form)
|
2022-07-28 15:00:43 +00:00
|
|
|
|
if err != nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, 500, err)
|
2022-07-28 15:00:43 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
if request.State == "" {
|
2022-10-11 10:07:29 +00:00
|
|
|
|
err = errors.New("GDiskErr: got empty state")
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusBadRequest, err)
|
2022-10-11 10:07:29 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
if request.Code == "" {
|
2022-10-11 10:07:29 +00:00
|
|
|
|
err = errors.New("GDiskErr: got empty code")
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusBadRequest, err)
|
2022-10-11 10:07:29 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2022-08-10 13:53:34 +00:00
|
|
|
|
// get user
|
2022-10-11 10:07:29 +00:00
|
|
|
|
var state tools.StateToken
|
2023-08-15 21:33:53 +00:00
|
|
|
|
err = tools.DecryptTokenAES(request.State, &state)
|
2022-10-11 10:07:29 +00:00
|
|
|
|
|
|
|
|
|
if err != nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusUnauthorized, err)
|
2022-08-10 13:53:34 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2022-07-28 15:00:43 +00:00
|
|
|
|
// generate token
|
2023-08-15 21:33:53 +00:00
|
|
|
|
token, err := h.GDisk.GetToken(r.Context(), request.Code)
|
2022-07-28 15:00:43 +00:00
|
|
|
|
if err != nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusInternalServerError, err)
|
2022-07-28 15:00:43 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2022-08-10 13:53:34 +00:00
|
|
|
|
gDisk, err := h.GDisk.NewClient(r.Context(), token)
|
2022-07-28 15:00:43 +00:00
|
|
|
|
if err != nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusInternalServerError, err)
|
2022-09-15 13:53:55 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
token = gDisk.Token
|
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
gUser, err := gDisk.GetUserInfo(r.Context())
|
2022-09-15 13:53:55 +00:00
|
|
|
|
if err != nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusInternalServerError, err)
|
2022-09-15 13:53:55 +00:00
|
|
|
|
return
|
2022-07-28 15:00:43 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Make default directories in Google Drive
|
2022-10-11 10:07:29 +00:00
|
|
|
|
gDiskData, err := h.dal.GDisk.GetByEmail(r.Context(), gUser.EmailAddress)
|
2022-07-28 15:00:43 +00:00
|
|
|
|
if err != nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusInternalServerError, err)
|
2022-08-11 20:32:10 +00:00
|
|
|
|
return
|
2022-07-28 15:00:43 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
var defaultID, defaultName, templateID, templateName, saveID, saveName string
|
2022-10-11 10:07:29 +00:00
|
|
|
|
if gDiskData != nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
defaultID = gDiskData.DefaultFolderID
|
2022-10-11 10:07:29 +00:00
|
|
|
|
defaultName = gDiskData.DefaultFolder
|
2023-08-15 21:33:53 +00:00
|
|
|
|
templateID = gDiskData.TemplateFolderID
|
2022-10-11 10:07:29 +00:00
|
|
|
|
templateName = gDiskData.TemplateFolder
|
2023-08-15 21:33:53 +00:00
|
|
|
|
saveID = gDiskData.SaveFolderID
|
2022-10-11 10:07:29 +00:00
|
|
|
|
saveName = gDiskData.SaveFolder
|
|
|
|
|
}
|
2022-09-15 13:53:55 +00:00
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
defaultFolder, templateFolder, saveFolder, err := gDisk.MakeDefaultDirs(defaultID, defaultName, templateID,
|
|
|
|
|
templateName, saveID, saveName)
|
2022-09-15 13:53:55 +00:00
|
|
|
|
if err != nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusInternalServerError, err)
|
2022-09-15 13:53:55 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
2022-07-28 15:00:43 +00:00
|
|
|
|
|
|
|
|
|
// Insert/Update token in DB
|
|
|
|
|
_, err = h.dal.GDisk.InsertOrUpdate(r.Context(), &model.GDisk{
|
2023-08-15 21:33:53 +00:00
|
|
|
|
PenaID: state.PenaID,
|
2022-10-11 10:07:29 +00:00
|
|
|
|
Name: fmt.Sprintf("Google Disk (%v)", gUser.EmailAddress),
|
2022-09-15 13:53:55 +00:00
|
|
|
|
DisplayName: gUser.DisplayName,
|
|
|
|
|
Email: gUser.EmailAddress,
|
|
|
|
|
PhotoLink: gUser.PhotoLink,
|
2022-07-28 15:00:43 +00:00
|
|
|
|
AccessToken: token.AccessToken,
|
|
|
|
|
RefreshToken: token.RefreshToken,
|
|
|
|
|
ExpiresIn: token.Expiry,
|
|
|
|
|
TokenType: token.TokenType,
|
2022-10-11 10:07:29 +00:00
|
|
|
|
DefaultFolder: defaultFolder.Name,
|
|
|
|
|
DefaultFolderID: defaultFolder.Id,
|
|
|
|
|
TemplateFolder: templateFolder.Name,
|
|
|
|
|
TemplateFolderID: templateFolder.Id,
|
|
|
|
|
SaveFolder: saveFolder.Name,
|
|
|
|
|
SaveFolderID: saveFolder.Id,
|
2022-07-28 15:00:43 +00:00
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusInternalServerError, err)
|
2022-07-28 15:00:43 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
http.Redirect(w, r, state.RedirectURL, http.StatusPermanentRedirect)
|
2022-08-10 13:53:34 +00:00
|
|
|
|
}
|
2022-07-28 15:00:43 +00:00
|
|
|
|
|
2022-10-11 10:07:29 +00:00
|
|
|
|
type ReqGDiskSetSettings struct {
|
2022-10-21 20:38:31 +00:00
|
|
|
|
ID string `json:"id"`
|
2022-10-11 10:07:29 +00:00
|
|
|
|
Name string `json:"name"` // Пользовательское название хранилища
|
|
|
|
|
DefaultFolder string `json:"default_folder"`
|
2023-08-15 21:33:53 +00:00
|
|
|
|
DefaultFolderID string `json:"default_folder_id"`
|
2022-10-11 10:07:29 +00:00
|
|
|
|
TemplateFolder string `json:"template_folder"`
|
|
|
|
|
TemplateFolderID string `json:"template_folder_id"`
|
|
|
|
|
SaveFolder string `json:"save_folder"`
|
|
|
|
|
SaveFolderID string `json:"save_folder_id"`
|
2022-08-10 13:53:34 +00:00
|
|
|
|
}
|
2022-07-28 15:00:43 +00:00
|
|
|
|
|
2022-10-11 10:07:29 +00:00
|
|
|
|
func (h *Handlers) GDiskSetSettings(w http.ResponseWriter, r *http.Request) {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
var request ReqGDiskSetSettings
|
2022-10-11 10:07:29 +00:00
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
amoData := middleware.GetAmoData(r)
|
2022-10-11 10:07:29 +00:00
|
|
|
|
if amoData == nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusUnauthorized, ErrorUnauthorized)
|
2022-10-11 10:07:29 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
2022-07-28 15:00:43 +00:00
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
err := decodePost(&request, r)
|
2022-07-28 15:00:43 +00:00
|
|
|
|
if err != nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusBadRequest, err)
|
2022-08-10 13:53:34 +00:00
|
|
|
|
return
|
2022-07-28 15:00:43 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
if request.ID == "" {
|
|
|
|
|
h.reportError(w, http.StatusBadRequest, errors.New("id required"))
|
2022-10-21 20:38:31 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2022-10-11 10:07:29 +00:00
|
|
|
|
err = h.dal.GDisk.Update(r.Context(), &model.GDisk{
|
2023-08-15 21:33:53 +00:00
|
|
|
|
ID: request.ID,
|
|
|
|
|
Name: request.Name,
|
|
|
|
|
DefaultFolder: request.DefaultFolder,
|
|
|
|
|
DefaultFolderID: request.DefaultFolderID,
|
|
|
|
|
TemplateFolder: request.TemplateFolder,
|
|
|
|
|
TemplateFolderID: request.TemplateFolderID,
|
|
|
|
|
SaveFolder: request.SaveFolder,
|
|
|
|
|
SaveFolderID: request.SaveFolderID,
|
2022-10-11 10:07:29 +00:00
|
|
|
|
})
|
2022-09-15 13:53:55 +00:00
|
|
|
|
|
2022-10-11 10:07:29 +00:00
|
|
|
|
if err != nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusInternalServerError, err)
|
2022-08-10 13:53:34 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
w.WriteHeader(http.StatusOK)
|
2022-10-11 10:07:29 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type ReqGDiskGetResources struct {
|
|
|
|
|
ID string `json:"id"` // ID хранилища
|
|
|
|
|
FolderID string `json:"folder_id"` // Folder id
|
|
|
|
|
Name string `json:"name,omitempty"` // Folder name
|
|
|
|
|
ParentID string `json:"parent_id,omitempty"` // Parent folder id
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// GDiskGetResources - возвращает поиск по папке, включая список её файлов и папок.
|
|
|
|
|
// Поведение:
|
|
|
|
|
// - Если не указан FolderID и Name возвращает корневой каталог Google Drive
|
|
|
|
|
// - Если указан только Name ищет файл\папку по всему Google Drive
|
|
|
|
|
// - Если указан Name и ParentID ищет файл\папку только в родителе
|
|
|
|
|
// - ParentID игнорируется без Name
|
|
|
|
|
func (h *Handlers) GDiskGetResources(w http.ResponseWriter, r *http.Request) {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
var request ReqGDiskGetResources
|
2022-10-11 10:07:29 +00:00
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
amoData := middleware.GetAmoData(r)
|
2022-08-10 13:53:34 +00:00
|
|
|
|
|
2022-10-11 10:07:29 +00:00
|
|
|
|
if amoData == nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusUnauthorized, ErrorUnauthorized)
|
2022-08-10 13:53:34 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
err := decodePost(&request, r)
|
2022-10-11 10:07:29 +00:00
|
|
|
|
if err != nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusBadRequest, err)
|
2022-10-11 10:07:29 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
if request.ID == "" {
|
|
|
|
|
h.reportError(w, http.StatusBadRequest, errors.New("id required"))
|
2022-10-11 10:07:29 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
gdiskInfo, err := h.dal.GDisk.GetByID(r.Context(), request.ID)
|
2022-08-10 13:53:34 +00:00
|
|
|
|
if err != nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusInternalServerError, err)
|
2022-08-10 13:53:34 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if gdiskInfo == nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusForbidden, errors.New("gdisk info not found"))
|
2022-08-10 13:53:34 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
client, err := h.GDisk.NewClient(r.Context(), gdiskInfo.Token())
|
|
|
|
|
if err != nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusForbidden, err)
|
2022-08-10 13:53:34 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2022-10-11 10:07:29 +00:00
|
|
|
|
var res *drive.FileList
|
2022-08-10 13:53:34 +00:00
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
if request.Name != "" {
|
|
|
|
|
res, err = client.GetResourcesByName(request.Name, request.ParentID)
|
2022-10-11 10:07:29 +00:00
|
|
|
|
} else {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
res, err = client.GetResources(request.FolderID)
|
2022-08-10 13:53:34 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusInternalServerError, err)
|
2022-08-10 13:53:34 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.sendResponse(w, http.StatusOK, res)
|
2022-08-10 13:53:34 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-09-15 13:53:55 +00:00
|
|
|
|
type ReqGDiskGetDirTemplate struct {
|
|
|
|
|
Email string `json:"email"` // Required. Google Email ?
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
// GDiskGetDirTemplate - возвращает данные по папке template, включая список её файлов и папок.
|
2022-08-10 13:53:34 +00:00
|
|
|
|
func (h *Handlers) GDiskGetDirTemplate(w http.ResponseWriter, r *http.Request) {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
var request ReqGDiskGetDirTemplate
|
2022-09-15 13:53:55 +00:00
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
err := decodePost(&request, r)
|
2022-09-15 13:53:55 +00:00
|
|
|
|
if err != nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusBadRequest, err)
|
2022-09-15 13:53:55 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
if request.Email == "" {
|
|
|
|
|
h.reportError(w, http.StatusBadRequest, errors.New("email required"))
|
2022-09-15 13:53:55 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
amoData := middleware.GetAmoData(r)
|
2022-08-10 13:53:34 +00:00
|
|
|
|
|
2022-11-12 10:58:54 +00:00
|
|
|
|
if amoData == nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusUnauthorized, ErrorUnauthorized)
|
2022-08-10 13:53:34 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
gdiskInfo, err := h.dal.GDisk.GetByEmail(r.Context(), request.Email)
|
2022-08-10 13:53:34 +00:00
|
|
|
|
if err != nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusInternalServerError, err)
|
2022-08-10 13:53:34 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if gdiskInfo == nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusForbidden, errors.New("gdisk info not found"))
|
2022-08-10 13:53:34 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if gdiskInfo.Token() == nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusForbidden, errors.New("google token invalid"))
|
2022-08-10 13:53:34 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
client, err := h.GDisk.NewClient(r.Context(), gdiskInfo.Token())
|
|
|
|
|
if err != nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusInternalServerError, err)
|
2022-08-10 13:53:34 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
dir, err := client.GetResources(gdiskInfo.TemplateFolderID)
|
|
|
|
|
if err != nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusInternalServerError, err)
|
2022-08-10 13:53:34 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.sendResponse(w, http.StatusOK, dir)
|
2022-08-10 13:53:34 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
// GDiskGetList - возвращает список хранилищ Google закрепленных за пользователем по его UserID из JWT.
|
2022-09-15 13:53:55 +00:00
|
|
|
|
func (h *Handlers) GDiskGetList(w http.ResponseWriter, r *http.Request) {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
amoData := middleware.GetAmoData(r)
|
2022-09-15 13:53:55 +00:00
|
|
|
|
|
2022-11-12 10:58:54 +00:00
|
|
|
|
if amoData == nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusUnauthorized, ErrorUnauthorized)
|
2022-09-15 13:53:55 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
gdiskInfo, err := h.dal.GDisk.GetListByPenaID(r.Context(), amoData.PenaID)
|
2022-09-15 13:53:55 +00:00
|
|
|
|
if err != nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusInternalServerError, err)
|
2022-09-15 13:53:55 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.sendResponse(w, http.StatusOK, gdiskInfo)
|
2022-09-15 13:53:55 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-10-11 10:07:29 +00:00
|
|
|
|
type ReqGDiskPutResources struct {
|
|
|
|
|
ID string `json:"ID"`
|
|
|
|
|
Name string `json:"name"`
|
|
|
|
|
ParentID string `json:"parent_id"`
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
// GDiskPutResources - создать папку в хранилище.
|
2022-10-11 10:07:29 +00:00
|
|
|
|
func (h *Handlers) GDiskPutResources(w http.ResponseWriter, r *http.Request) {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
var request ReqGDiskPutResources
|
2022-10-11 10:07:29 +00:00
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
amoData := middleware.GetAmoData(r)
|
2022-10-11 10:07:29 +00:00
|
|
|
|
|
|
|
|
|
if amoData == nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusUnauthorized, ErrorUnauthorized)
|
2022-10-11 10:07:29 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
2022-08-10 13:53:34 +00:00
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
err := decodePost(&request, r)
|
2022-10-11 10:07:29 +00:00
|
|
|
|
if err != nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusBadRequest, err)
|
2022-10-11 10:07:29 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
if request.ID == "" {
|
|
|
|
|
h.reportError(w, http.StatusBadRequest, errors.New("id required"))
|
2022-10-11 10:07:29 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
if request.Name == "" {
|
|
|
|
|
h.reportError(w, http.StatusBadRequest, errors.New("name required"))
|
2022-10-11 10:07:29 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
gdiskInfo, err := h.dal.GDisk.GetByID(r.Context(), request.ID)
|
2022-10-11 10:07:29 +00:00
|
|
|
|
if err != nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusInternalServerError, err)
|
2022-10-11 10:07:29 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if gdiskInfo == nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusForbidden, errors.New("gdisk info not found"))
|
2022-10-11 10:07:29 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
client, err := h.GDisk.NewClient(r.Context(), gdiskInfo.Token())
|
|
|
|
|
if err != nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusForbidden, err)
|
2022-10-11 10:07:29 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
file, err := client.PutResources(request.Name, request.ParentID)
|
2022-10-11 10:07:29 +00:00
|
|
|
|
if err != nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusInternalServerError, err)
|
2022-10-11 10:07:29 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.sendResponse(w, http.StatusOK, file)
|
2022-08-10 13:53:34 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-11-24 19:37:47 +00:00
|
|
|
|
type ReqGDiskUploadResources struct {
|
|
|
|
|
ID string `json:"id" schema:"id"` // Storage ID
|
|
|
|
|
ParentID string `json:"parent_id" schema:"parent_id"`
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
// GDiskUploadResources - загрузить файл в хранилище.
|
2022-11-24 19:37:47 +00:00
|
|
|
|
func (h *Handlers) GDiskUploadResources(w http.ResponseWriter, r *http.Request) {
|
|
|
|
|
// Check form
|
|
|
|
|
fileData, fileHeader, err := r.FormFile("file")
|
2023-08-15 21:33:53 +00:00
|
|
|
|
|
|
|
|
|
defer fileData.Close() //nolint
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
h.reportError(w, http.StatusInternalServerError, err)
|
|
|
|
|
return
|
|
|
|
|
}
|
2022-11-24 19:37:47 +00:00
|
|
|
|
|
|
|
|
|
var req ReqGDiskUploadResources
|
|
|
|
|
err = schema.NewDecoder().Decode(&req, r.Form)
|
|
|
|
|
if err != nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusBadRequest, err)
|
2022-11-24 19:37:47 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if req.ID == "" {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusBadRequest, errors.New("id required"))
|
2022-11-24 19:37:47 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var maxSize int64 = 10 << 20 // mb
|
|
|
|
|
if fileHeader.Size > maxSize {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusBadRequest, errors.New("max size 10 mb"))
|
2022-11-24 19:37:47 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Download file to the temp
|
|
|
|
|
|
|
|
|
|
downloadPath := fmt.Sprintf("%v/%v", templategen.TempDownloaded, fileHeader.Filename)
|
|
|
|
|
|
|
|
|
|
out, err := os.Create(downloadPath)
|
2023-08-15 21:33:53 +00:00
|
|
|
|
defer out.Close() //nolint
|
2022-11-24 19:37:47 +00:00
|
|
|
|
|
|
|
|
|
if err != nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusInternalServerError, err)
|
2022-11-24 19:37:47 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_, err = io.Copy(out, fileData)
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusInternalServerError, err)
|
2022-11-24 19:37:47 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Upload file to the storage
|
|
|
|
|
storage, err := h.dal.GDisk.GetByID(r.Context(), req.ID)
|
|
|
|
|
if err != nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusInternalServerError, err)
|
2022-11-24 19:37:47 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
client, err := h.GDisk.NewClient(r.Context(), storage.Token())
|
|
|
|
|
if err != nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusInternalServerError, err)
|
2022-11-24 19:37:47 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
h.logger.Info("INFO", zap.String("downloadPath", downloadPath))
|
|
|
|
|
|
2022-12-19 12:01:38 +00:00
|
|
|
|
_, _, err = client.UploadFile(downloadPath, GDisk.MimeTypeDocx, req.ParentID)
|
2022-11-24 19:37:47 +00:00
|
|
|
|
if err != nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusInternalServerError, err)
|
2022-11-24 19:37:47 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
w.WriteHeader(http.StatusOK)
|
|
|
|
|
}
|
|
|
|
|
|
2022-10-11 10:07:29 +00:00
|
|
|
|
type ReqGDiskDeleteResources struct {
|
|
|
|
|
ID string `json:"id"`
|
|
|
|
|
FolderID string `json:"folder_id"`
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
// GDiskDeleteResources - удалить папку\файл.
|
2022-10-11 10:07:29 +00:00
|
|
|
|
func (h *Handlers) GDiskDeleteResources(w http.ResponseWriter, r *http.Request) {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
var request ReqGDiskDeleteResources
|
2022-10-11 10:07:29 +00:00
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
amoData := middleware.GetAmoData(r)
|
2022-10-11 10:07:29 +00:00
|
|
|
|
|
|
|
|
|
if amoData == nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusUnauthorized, ErrorUnauthorized)
|
2022-10-11 10:07:29 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
err := decodePost(&request, r)
|
2022-10-11 10:07:29 +00:00
|
|
|
|
if err != nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusBadRequest, err)
|
2022-10-11 10:07:29 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
if request.ID == "" {
|
|
|
|
|
h.reportError(w, http.StatusBadRequest, errors.New("id required"))
|
2022-10-11 10:07:29 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
if request.FolderID == "" {
|
|
|
|
|
h.reportError(w, http.StatusBadRequest, errors.New("folder_id required"))
|
2022-10-11 10:07:29 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
gdiskInfo, err := h.dal.GDisk.GetByID(r.Context(), request.ID)
|
2022-10-11 10:07:29 +00:00
|
|
|
|
if err != nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusInternalServerError, err)
|
2022-10-11 10:07:29 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if gdiskInfo == nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusForbidden, errors.New("gdisk info not found"))
|
2022-10-11 10:07:29 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
client, err := h.GDisk.NewClient(r.Context(), gdiskInfo.Token())
|
|
|
|
|
if err != nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusForbidden, err)
|
2022-10-11 10:07:29 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
err = client.DeleteResources(request.FolderID)
|
2022-10-11 10:07:29 +00:00
|
|
|
|
if err != nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
h.reportError(w, http.StatusInternalServerError, err)
|
2022-10-11 10:07:29 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
2022-07-28 15:00:43 +00:00
|
|
|
|
|
2022-10-11 10:07:29 +00:00
|
|
|
|
w.WriteHeader(http.StatusOK)
|
2022-07-28 15:00:43 +00:00
|
|
|
|
}
|