docxTemplater/handlers/gdisk.go
Danil Solovyov a39e9acbfa Tasks:
- OAuth Yandex API (#2vc89e8)
- OAuth Google API (#2vc8cqc)
- MAIN - работа с дисками (#2wmf8jf)
-
2022-09-15 18:53:55 +05:00

271 lines
6.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package handlers
import (
"errors"
"github.com/Pena-Co-Ltd/amocrm_templategen_back/dal/model"
"github.com/gorilla/schema"
"google.golang.org/api/drive/v3"
"net/http"
)
type ReqGDiskSaveToken struct {
State string
Code string
Scope string
}
// GDiskSaveToken - сохраняет токен авторизации
func (h *Handlers) GDiskSaveToken(w http.ResponseWriter, r *http.Request) {
var req ReqGDiskSaveToken
err := r.ParseForm()
if err != nil {
h.reportError(w, err, http.StatusBadRequest)
return
}
err = schema.NewDecoder().Decode(&req, r.Form)
if err != nil {
h.reportError(w, err, 500)
return
}
// get user
user := getJwtUser(r)
if user == nil {
h.reportError(w, ErrorUnauthorized, http.StatusUnauthorized)
return
}
// generate token
token, err := h.GDisk.GetToken(r.Context(), req.Code)
if err != nil {
h.reportError(w, err, 500)
return
}
gDisk, err := h.GDisk.NewClient(r.Context(), token)
if err != nil {
h.reportError(w, err, http.StatusInternalServerError)
return
}
token = gDisk.Token
gDiskUser, err := gDisk.GetUserInfo()
if err != nil {
h.reportError(w, err, http.StatusInternalServerError)
return
}
// Make default directories in Google Drive
gDiskData, err := h.dal.GDisk.GetByEmail(r.Context(), gDiskUser.EmailAddress)
var templateId, saveId string
if gDiskData != nil {
templateId = gDiskData.TemplateFolderID
saveId = gDiskData.SaveFolderID
}
templateId, saveId, err = gDisk.MakeDefaultDirs(templateId, saveId)
if err != nil {
h.reportError(w, err, http.StatusInternalServerError)
return
}
gUser, err := gDisk.GetUserInfo()
if err != nil {
h.reportError(w, err, http.StatusInternalServerError)
return
}
// Insert/Update token in DB
_, err = h.dal.GDisk.InsertOrUpdate(r.Context(), &model.GDisk{
UserID: user.UserID,
DisplayName: gUser.DisplayName,
Email: gUser.EmailAddress,
PhotoLink: gUser.PhotoLink,
AccessToken: token.AccessToken,
RefreshToken: token.RefreshToken,
ExpiresIn: token.Expiry,
TokenType: token.TokenType,
TemplateFolder: "templategen/templates",
TemplateFolderID: templateId,
SaveFolder: "templategen/saved",
SaveFolderID: saveId,
})
if err != nil {
h.reportError(w, err, http.StatusInternalServerError)
return
}
}
func (h *Handlers) GDiskGetFile(w http.ResponseWriter, r *http.Request) {
}
type ReqGDiskGetDirInfo struct {
Email string `json:"email"` // Required. Google Email ?
ID string `json:"id"` // Folder id
Name string `json:"name,omitempty"` // Folder name
ParentID string `json:"parent_id,omitempty"` // Parent folder id
}
// GDiskGetDirInfo - возвращает данные по папке, включая список её файлов и папок
func (h *Handlers) GDiskGetDirInfo(w http.ResponseWriter, r *http.Request) {
var req ReqGDiskGetDirInfo
err := decodePost(&req, r)
if err != nil {
h.reportError(w, err, http.StatusBadRequest)
return
}
if req.Email == "" {
h.reportError(w, errors.New("email required"), http.StatusBadRequest)
}
if req.ID == "" && req.Name == "" {
h.reportError(w, errors.New("id or name required"), http.StatusBadRequest)
return
}
amoData := getAmoByJwt(r)
user := getJwtUser(r)
if amoData == nil && user == nil {
h.reportError(w, ErrorUnauthorized, http.StatusUnauthorized)
return
}
gdiskInfo, err := h.dal.GDisk.GetByEmail(r.Context(), req.Email)
if err != nil {
h.reportError(w, err, http.StatusInternalServerError)
return
}
if gdiskInfo == nil {
h.reportError(w, errors.New("gdisk info not found"), http.StatusForbidden)
return
}
client, err := h.GDisk.NewClient(r.Context(), gdiskInfo.Token())
if err != nil {
h.reportError(w, err, http.StatusForbidden)
return
}
var res []*drive.File
if req.Name != "" {
res, err = client.GetResourceByName(req.Name, req.ParentID)
if err != nil {
h.reportError(w, err, http.StatusInternalServerError)
return
}
}
dir, err := client.GetResources(res[0].Id)
if err != nil {
h.reportError(w, err, http.StatusInternalServerError)
return
}
sendResponse(w, 200, dir)
}
type ReqGDiskGetDirTemplate struct {
Email string `json:"email"` // Required. Google Email ?
}
// GDiskGetDirTemplate - возвращает данные по папке template, включая список её файлов и папок
func (h *Handlers) GDiskGetDirTemplate(w http.ResponseWriter, r *http.Request) {
var req ReqGDiskGetDirTemplate
err := decodePost(&req, r)
if err != nil {
h.reportError(w, err, http.StatusBadRequest)
return
}
if req.Email == "" {
h.reportError(w, errors.New("email required"), http.StatusBadRequest)
}
amoData := getAmoByJwt(r)
user := getJwtUser(r)
if amoData == nil && user == nil {
h.reportError(w, ErrorUnauthorized, http.StatusUnauthorized)
return
}
gdiskInfo, err := h.dal.GDisk.GetByEmail(r.Context(), req.Email)
if err != nil {
h.reportError(w, err, http.StatusInternalServerError)
return
}
if gdiskInfo == nil {
h.reportError(w, errors.New("gdisk info not found"), http.StatusForbidden)
return
}
if gdiskInfo.Token() == nil {
h.reportError(w, errors.New("google token invalid"), http.StatusForbidden)
return
}
client, err := h.GDisk.NewClient(r.Context(), gdiskInfo.Token())
if err != nil {
h.reportError(w, err, http.StatusInternalServerError)
return
}
dir, err := client.GetResources(gdiskInfo.TemplateFolderID)
if err != nil {
h.reportError(w, err, http.StatusInternalServerError)
return
}
sendResponse(w, 200, dir)
}
// GDiskGetList - возвращает список хранилищ Google закрепленных за пользователем по его UserID из JWT
func (h *Handlers) GDiskGetList(w http.ResponseWriter, r *http.Request) {
amoData := getAmoByJwt(r)
user := getJwtUser(r)
if amoData == nil && user == nil {
h.reportError(w, ErrorUnauthorized, http.StatusUnauthorized)
return
}
var userID string
if user != nil {
userID = user.UserID
} else {
userID = amoData.UserID
}
gdiskInfo, err := h.dal.GDisk.GetListByUserID(r.Context(), userID)
if err != nil {
h.reportError(w, err, http.StatusInternalServerError)
return
}
sendResponse(w, http.StatusOK, gdiskInfo)
}
func (h *Handlers) GDiskMkDir(w http.ResponseWriter, r *http.Request) {
}
func (h *Handlers) GDiskDelDir(w http.ResponseWriter, r *http.Request) {
}