
- OAuth Yandex API (#2vc89e8) - OAuth Google API (#2vc8cqc) - MAIN - работа с дисками (#2wmf8jf) -
181 lines
4.4 KiB
Go
181 lines
4.4 KiB
Go
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)
|
||
}
|