docxTemplater/handlers/yadisk.go

181 lines
4.4 KiB
Go
Raw Normal View History

2022-07-28 15:00:43 +00:00
package handlers
import (
"errors"
"fmt"
"github.com/Pena-Co-Ltd/amocrm_templategen_back/dal/model"
2022-07-28 15:00:43 +00:00
"github.com/gorilla/schema"
"go.uber.org/zap"
2022-08-10 13:53:34 +00:00
"golang.org/x/oauth2"
2022-07-28 15:00:43 +00:00
"net/http"
"time"
)
type ReqYaDiskSaveToken struct {
2022-07-28 15:00:43 +00:00
AccessToken string `json:"access_token" schema:"access_token"`
Code string `json:"code"`
2022-07-28 15:00:43 +00:00
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
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
}
if req.Error != "" {
err = errors.New("YaDiskErr:" + req.Error)
2022-07-28 15:00:43 +00:00
h.reportError(w, err, 500)
return
}
if req.AccessToken == "" && req.Code == "" {
2022-07-28 15:00:43 +00:00
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
}
2022-08-10 13:53:34 +00:00
token := &oauth2.Token{
AccessToken: req.AccessToken,
TokenType: req.TokenType,
RefreshToken: req.RefreshToken,
Expiry: time.Now().Add(time.Duration(req.ExpiresIn) * time.Second),
2022-08-10 13:53:34 +00:00
}
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)
2022-07-28 15:00:43 +00:00
// 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,
2022-08-10 13:53:34 +00:00
AccessToken: token.AccessToken,
RefreshToken: token.RefreshToken,
ExpiresIn: token.Expiry,
TokenType: token.TokenType,
2022-07-28 15:00:43 +00:00
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")
2022-07-28 15:00:43 +00:00
if err != nil {
h.logger.Error("ErrorHandler", zap.Error(err))
}
err = yaDiskClient.PutResources("disk:/templategen/templates")
2022-07-28 15:00:43 +00:00
if err != nil {
h.logger.Error("ErrorHandler", zap.Error(err))
}
err = yaDiskClient.PutResources("disk:/templategen/saved")
2022-07-28 15:00:43 +00:00
if err != nil {
h.logger.Error("ErrorHandler", zap.Error(err))
}
// Может отправлять access token, чтобы на фронте сами могли обращаться к Я.диску?
err = sendResponse(w, 200, map[string]string{"accessToken": req.AccessToken})
2022-07-28 15:00:43 +00:00
if err != nil {
h.reportError(w, err, 500)
}
}
type ReqYaDiskSetFolders struct {
2022-07-28 15:00:43 +00:00
TemplateFolder string `json:"template_folder"`
SaveFolder string `json:"save_folder"`
}
func (h *Handlers) YaDiskSetFolders(w http.ResponseWriter, r *http.Request) {
var req ReqYaDiskSetFolders
2022-07-28 15:00:43 +00:00
user := getJwtUser(r)
if user == nil {
h.reportError(w, ErrorUnauthorized, http.StatusUnauthorized)
return
}
err := decodePost(&req, r)
2022-07-28 15:00:43 +00:00
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},
2022-07-28 15:00:43 +00:00
)
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)
2022-07-28 15:00:43 +00:00
user := getJwtUser(r)
if amoData == nil && user == nil {
2022-07-28 15:00:43 +00:00
h.reportError(w, ErrorUnauthorized, http.StatusUnauthorized)
return
}
var userID string
if user != nil {
userID = user.UserID
} else {
userID = amoData.UserID
2022-08-10 13:53:34 +00:00
}
yadiskInfo, err := h.dal.YaDisk.GetListByUserID(r.Context(), userID)
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
}
sendResponse(w, http.StatusOK, yadiskInfo)
2022-07-28 15:00:43 +00:00
}