docxTemplater/handlers/yadisk.go

166 lines
3.9 KiB
Go
Raw Normal View History

2022-07-28 15:00:43 +00:00
package handlers
import (
"amocrm_templategen_back/dal/model"
"errors"
"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 RespYaDiskSaveToken struct {
AccessToken string `json:"access_token" schema:"access_token"`
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 resp RespYaDiskSaveToken
err := r.ParseForm()
if err != nil {
h.reportError(w, err, http.StatusBadRequest)
return
}
err = schema.NewDecoder().Decode(&resp, r.Form)
if err != nil {
h.reportError(w, err, 500)
return
}
if resp.Error != "" {
err = errors.New("YaDiskErr:" + resp.Error)
h.reportError(w, err, 500)
return
}
if resp.AccessToken == "" {
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: resp.AccessToken,
TokenType: resp.TokenType,
RefreshToken: resp.RefreshToken,
Expiry: time.Now().Add(time.Duration(resp.ExpiresIn) * time.Second),
}
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,
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
}
2022-08-10 13:53:34 +00:00
YaDiskClient := h.YaDisk.NewClient(token)
2022-07-28 15:00:43 +00:00
// 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))
}
// Insert yandex token in cookies
err = sendResponse(w, 200, map[string]string{"accessToken": resp.AccessToken})
if err != nil {
h.reportError(w, err, 500)
}
}
type RespYaDiskSetFolders struct {
TemplateFolder string `json:"template_folder"`
SaveFolder string `json:"save_folder"`
}
func (h *Handlers) YaDiskSetFolders(w http.ResponseWriter, r *http.Request) {
var resp RespYaDiskSetFolders
user := getJwtUser(r)
if user == nil {
h.reportError(w, ErrorUnauthorized, http.StatusUnauthorized)
return
}
err := decodePost(&resp, r)
if err != nil {
h.reportError(w, err, http.StatusBadRequest)
return
}
err = h.dal.YaDisk.Update(r.Context(), &model.YaDisk{
TemplateFolder: resp.TemplateFolder,
SaveFolder: resp.SaveFolder},
)
if err != nil {
h.reportError(w, err, http.StatusInternalServerError)
return
}
sendResponse(w, 200, nil)
}
func (h *Handlers) YaDiskGetInfo(w http.ResponseWriter, r *http.Request) {
user := getJwtUser(r)
if user == nil {
h.reportError(w, ErrorUnauthorized, http.StatusUnauthorized)
return
}
2022-08-10 13:53:34 +00:00
userData, err := h.dal.YaDisk.GetByUserID(r.Context(), user.UserID)
token := &oauth2.Token{
AccessToken: userData.AccessToken,
TokenType: userData.TokenType,
RefreshToken: userData.RefreshToken,
Expiry: time.Time{},
}
if !token.Valid() {
h.reportError(w, errors.New("invalid yandex token"), http.StatusForbidden)
return
}
client := h.YaDisk.NewClient(token)
2022-07-28 15:00:43 +00:00
disk, err := client.GetDisk()
if err != nil {
h.reportError(w, err, http.StatusInternalServerError)
}
sendResponse(w, 200, disk)
}