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

181 lines
4.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"
"fmt"
"github.com/Pena-Co-Ltd/amocrm_templategen_back/dal/model"
"github.com/gorilla/schema"
"go.uber.org/zap"
"golang.org/x/oauth2"
"net/http"
"time"
)
type ReqYaDiskSaveToken struct {
AccessToken string `json:"access_token" schema:"access_token"`
Code string `json:"code"`
ExpiresIn int64 `json:"expires_in" schema:"expires_in"`
TokenType string `json:"token_type" schema:"token_type"`
RefreshToken string `json:"refresh_token"`
State string `json:"state" schema:"state"`
Scope string `json:"scope" schema:"scope"`
Error string `json:"error" schema:"error"`
}
func (h *Handlers) YaDiskSaveToken(w http.ResponseWriter, r *http.Request) {
var req ReqYaDiskSaveToken
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
}
if req.Error != "" {
err = errors.New("YaDiskErr:" + req.Error)
h.reportError(w, err, 500)
return
}
if req.AccessToken == "" && req.Code == "" {
err = errors.New("YaDiskErr: got empty token")
h.reportError(w, err, http.StatusBadRequest)
return
}
user := getJwtUser(r)
if user == nil {
h.reportError(w, ErrorUnauthorized, http.StatusUnauthorized)
return
}
token := &oauth2.Token{
AccessToken: req.AccessToken,
TokenType: req.TokenType,
RefreshToken: req.RefreshToken,
Expiry: time.Now().Add(time.Duration(req.ExpiresIn) * time.Second),
}
yaDiskClient, err := h.YaDisk.NewClient(r.Context(), token, req.Code)
if err != nil {
h.reportError(w, err, http.StatusForbidden)
return
}
token = yaDiskClient.Token
yaUser, err := yaDiskClient.GetUser()
if err != nil {
h.reportError(w, err, http.StatusInternalServerError)
return
}
fmt.Println("yaUser", yaUser)
// Insert/Update token in DB
_, err = h.dal.YaDisk.InsertOrUpdate(r.Context(), &model.YaDisk{
UserID: user.UserID,
UID: yaUser.Uid,
Login: yaUser.Login,
DisplayName: yaUser.DisplayName,
AccessToken: token.AccessToken,
RefreshToken: token.RefreshToken,
ExpiresIn: token.Expiry,
TokenType: token.TokenType,
TemplateFolder: "disk:/templategen/templates",
SaveFolder: "disk:/templategen/saved",
})
if err != nil {
h.reportError(w, err, 500)
return
}
// Make default directories in YandexDisk
err = yaDiskClient.PutResources("disk:/templategen")
if err != nil {
h.logger.Error("ErrorHandler", zap.Error(err))
}
err = yaDiskClient.PutResources("disk:/templategen/templates")
if err != nil {
h.logger.Error("ErrorHandler", zap.Error(err))
}
err = yaDiskClient.PutResources("disk:/templategen/saved")
if err != nil {
h.logger.Error("ErrorHandler", zap.Error(err))
}
// Может отправлять access token, чтобы на фронте сами могли обращаться к Я.диску?
err = sendResponse(w, 200, map[string]string{"accessToken": req.AccessToken})
if err != nil {
h.reportError(w, err, 500)
}
}
type ReqYaDiskSetFolders struct {
TemplateFolder string `json:"template_folder"`
SaveFolder string `json:"save_folder"`
}
func (h *Handlers) YaDiskSetFolders(w http.ResponseWriter, r *http.Request) {
var req ReqYaDiskSetFolders
user := getJwtUser(r)
if user == nil {
h.reportError(w, ErrorUnauthorized, http.StatusUnauthorized)
return
}
err := decodePost(&req, r)
if err != nil {
h.reportError(w, err, http.StatusBadRequest)
return
}
err = h.dal.YaDisk.Update(r.Context(), &model.YaDisk{
TemplateFolder: req.TemplateFolder,
SaveFolder: req.SaveFolder},
)
if err != nil {
h.reportError(w, err, http.StatusInternalServerError)
return
}
sendResponse(w, 200, nil)
}
// YaDiskGetList - возвращает список хранилищ Yandex закрепленных за пользователем по его UserID из JWT
func (h *Handlers) YaDiskGetList(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
}
yadiskInfo, err := h.dal.YaDisk.GetListByUserID(r.Context(), userID)
if err != nil {
h.reportError(w, err, http.StatusInternalServerError)
return
}
sendResponse(w, http.StatusOK, yadiskInfo)
}