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)
|
|
|
|
}
|