docxTemplater/handlers/gdisk.go
Danil Solovyov 5ddc6b166e Init
2022-07-28 20:00:43 +05:00

140 lines
3.0 KiB
Go

package handlers
import (
"amocrm_templategen_back/dal/model"
"amocrm_templategen_back/middleware"
"github.com/dgrijalva/jwt-go"
"github.com/gorilla/schema"
"go.uber.org/zap"
"google.golang.org/api/drive/v3"
"net/http"
)
type RespGDiskSaveToken struct {
State string
Code string
Scope string
}
func (h *Handlers) GDiskSaveToken(w http.ResponseWriter, r *http.Request) {
var resp RespGDiskSaveToken
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
}
// generate token
token, err := h.GDisk.GetToken(r.Context(), resp.Code)
if err != nil {
h.reportError(w, err, 500)
return
}
user := getJwtUser(r)
if user == nil {
h.reportError(w, ErrorUnauthorized, http.StatusUnauthorized)
return
}
gDisk, err := h.GDisk.NewClient(r.Context(), token.AccessToken)
if err != nil {
h.logger.Error("ErrorHandler", zap.Error(err))
}
// Make default directories in Google Drive
// Check folders: Basic Folder
fileList, err := gDisk.GetResources("templategen", "")
if err != nil {
h.logger.Error("ErrorHandler", zap.Error(err))
}
var basicFolder, templateFolder, saveFolder *drive.File
if fileList == nil {
basicFolder, err = gDisk.PutResources("templategen", "")
if err != nil {
h.logger.Error("ErrorHandler", zap.Error(err))
}
} else {
basicFolder = fileList[0]
}
// Check folders: Template Folder
fileList, err = gDisk.GetResources("templates", basicFolder.Id)
if err != nil {
h.logger.Error("ErrorHandler", zap.Error(err))
}
if fileList == nil {
templateFolder, err = gDisk.PutResources("templates", basicFolder.Id)
if err != nil {
h.logger.Error("ErrorHandler", zap.Error(err))
}
} else {
templateFolder = fileList[0]
}
// Check folders: Save Folder
fileList, err = gDisk.GetResources("saved", basicFolder.Id)
if err != nil {
h.logger.Error("ErrorHandler", zap.Error(err))
}
if fileList == nil {
saveFolder, err = gDisk.PutResources("saved", basicFolder.Id)
if err != nil {
h.logger.Error("ErrorHandler", zap.Error(err))
}
} else {
saveFolder = fileList[0]
}
// Insert/Update token in DB
_, err = h.dal.GDisk.InsertOrUpdate(r.Context(), &model.GDisk{
UserID: user.UserID,
AccessToken: token.AccessToken,
RefreshToken: token.RefreshToken,
ExpiresIn: token.Expiry,
TokenType: token.TokenType,
TemplateFolder: "templategen/templates",
TemplateFolderID: templateFolder.Id,
SaveFolder: "templategen/saved",
SaveFolderID: saveFolder.Id,
})
if err != nil {
h.reportError(w, err, 500)
return
}
// Insert google token in cookies
user.GDiskAccessToken = token.AccessToken
jwtToken := jwt.NewWithClaims(jwt.SigningMethodHS256, user)
ss, err := jwtToken.SignedString(middleware.JwtSecret)
if err != nil {
h.reportError(w, err, 500)
}
http.SetCookie(w, &http.Cookie{
Name: "Authorization",
Value: ss,
MaxAge: 3600 * 24 * 30,
Path: "/",
})
}