docxTemplater/handlers/gdisk.go

271 lines
6.4 KiB
Go
Raw Normal View History

2022-07-28 15:00:43 +00:00
package handlers
import (
2022-08-10 13:53:34 +00:00
"errors"
"github.com/Pena-Co-Ltd/amocrm_templategen_back/dal/model"
2022-07-28 15:00:43 +00:00
"github.com/gorilla/schema"
"google.golang.org/api/drive/v3"
"net/http"
)
type ReqGDiskSaveToken struct {
2022-07-28 15:00:43 +00:00
State string
Code string
Scope string
}
2022-08-10 13:53:34 +00:00
// GDiskSaveToken - сохраняет токен авторизации
2022-07-28 15:00:43 +00:00
func (h *Handlers) GDiskSaveToken(w http.ResponseWriter, r *http.Request) {
var req ReqGDiskSaveToken
2022-07-28 15:00:43 +00:00
err := r.ParseForm()
if err != nil {
h.reportError(w, err, http.StatusBadRequest)
return
}
err = schema.NewDecoder().Decode(&req, r.Form)
2022-07-28 15:00:43 +00:00
if err != nil {
h.reportError(w, err, 500)
return
}
2022-08-10 13:53:34 +00:00
// get user
user := getJwtUser(r)
if user == nil {
h.reportError(w, ErrorUnauthorized, http.StatusUnauthorized)
return
}
2022-07-28 15:00:43 +00:00
// generate token
token, err := h.GDisk.GetToken(r.Context(), req.Code)
2022-07-28 15:00:43 +00:00
if err != nil {
h.reportError(w, err, 500)
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 {
h.reportError(w, err, http.StatusInternalServerError)
return
}
token = gDisk.Token
gDiskUser, err := gDisk.GetUserInfo()
if err != nil {
h.reportError(w, err, http.StatusInternalServerError)
return
2022-07-28 15:00:43 +00:00
}
// Make default directories in Google Drive
gDiskData, err := h.dal.GDisk.GetByEmail(r.Context(), gDiskUser.EmailAddress)
2022-07-28 15:00:43 +00:00
var templateId, saveId string
if gDiskData != nil {
templateId = gDiskData.TemplateFolderID
saveId = gDiskData.SaveFolderID
2022-07-28 15:00:43 +00:00
}
templateId, saveId, err = gDisk.MakeDefaultDirs(templateId, saveId)
2022-07-28 15:00:43 +00:00
if err != nil {
h.reportError(w, err, http.StatusInternalServerError)
return
2022-07-28 15:00:43 +00:00
}
gUser, err := gDisk.GetUserInfo()
if err != nil {
h.reportError(w, err, http.StatusInternalServerError)
return
}
2022-07-28 15:00:43 +00:00
// 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,
2022-07-28 15:00:43 +00:00
AccessToken: token.AccessToken,
RefreshToken: token.RefreshToken,
ExpiresIn: token.Expiry,
TokenType: token.TokenType,
TemplateFolder: "templategen/templates",
TemplateFolderID: templateId,
2022-07-28 15:00:43 +00:00
SaveFolder: "templategen/saved",
SaveFolderID: saveId,
2022-07-28 15:00:43 +00:00
})
if err != nil {
h.reportError(w, err, http.StatusInternalServerError)
2022-07-28 15:00:43 +00:00
return
}
2022-08-10 13:53:34 +00:00
}
func (h *Handlers) GDiskGetFile(w http.ResponseWriter, r *http.Request) {
2022-07-28 15:00:43 +00:00
2022-08-10 13:53:34 +00:00
}
2022-07-28 15:00:43 +00:00
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
2022-08-10 13:53:34 +00:00
}
2022-07-28 15:00:43 +00:00
2022-08-10 13:53:34 +00:00
// GDiskGetDirInfo - возвращает данные по папке, включая список её файлов и папок
func (h *Handlers) GDiskGetDirInfo(w http.ResponseWriter, r *http.Request) {
var req ReqGDiskGetDirInfo
2022-07-28 15:00:43 +00:00
err := decodePost(&req, r)
2022-07-28 15:00:43 +00:00
if err != nil {
2022-08-10 13:53:34 +00:00
h.reportError(w, err, http.StatusBadRequest)
return
2022-07-28 15:00:43 +00:00
}
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)
2022-08-10 13:53:34 +00:00
return
}
amoData := getAmoByJwt(r)
user := getJwtUser(r)
if amoData == nil && user == nil {
h.reportError(w, ErrorUnauthorized, http.StatusUnauthorized)
2022-08-10 13:53:34 +00:00
return
}
gdiskInfo, err := h.dal.GDisk.GetByEmail(r.Context(), req.Email)
2022-08-10 13:53:34 +00:00
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)
2022-08-10 13:53:34 +00:00
return
}
var res []*drive.File
if req.Name != "" {
res, err = client.GetResourceByName(req.Name, req.ParentID)
2022-08-10 13:53:34 +00:00
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, включая список её файлов и папок
2022-08-10 13:53:34 +00:00
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)
}
2022-08-10 13:53:34 +00:00
amoData := getAmoByJwt(r)
user := getJwtUser(r)
if amoData == nil && user == nil {
h.reportError(w, ErrorUnauthorized, http.StatusUnauthorized)
2022-08-10 13:53:34 +00:00
return
}
gdiskInfo, err := h.dal.GDisk.GetByEmail(r.Context(), req.Email)
2022-08-10 13:53:34 +00:00
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)
}
2022-08-10 13:53:34 +00:00
func (h *Handlers) GDiskMkDir(w http.ResponseWriter, r *http.Request) {
}
func (h *Handlers) GDiskDelDir(w http.ResponseWriter, r *http.Request) {
2022-07-28 15:00:43 +00:00
}