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: "/", }) }