package handlers import ( "amocrm_templategen_back/dal/model" "errors" "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 } // GDiskSaveToken - сохраняет токен авторизации 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 } // get user user := getJwtUser(r) if user == nil { h.reportError(w, ErrorUnauthorized, http.StatusUnauthorized) return } // generate token token, err := h.GDisk.GetToken(r.Context(), resp.Code) if err != nil { h.reportError(w, err, 500) return } gDisk, err := h.GDisk.NewClient(r.Context(), token) if err != nil { h.logger.Error("ErrorHandler", zap.Error(err)) } // Make default directories in Google Drive // Check folders: Basic Folder fileList, err := gDisk.GetResourceByName("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.GetResourceByName("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.GetResourceByName("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 } } func (h *Handlers) GDiskGetFile(w http.ResponseWriter, r *http.Request) { } type RespGDiskGetDirInfo struct { ID string Name string ParentID string } // GDiskGetDirInfo - возвращает данные по папке, включая список её файлов и папок func (h *Handlers) GDiskGetDirInfo(w http.ResponseWriter, r *http.Request) { var resp RespGDiskGetDirInfo err := decodePost(&resp, r) if err != nil { h.reportError(w, err, http.StatusBadRequest) return } if resp.ID == "" && resp.Name == "" { h.reportError(w, err, http.StatusBadRequest) return } amoData := getAmoByJwt(r) user := getJwtUser(r) if amoData == nil && user == nil { h.reportError(w, errors.New("amo account not found"), http.StatusUnauthorized) return } var userId string if amoData != nil { userId = amoData.UserID } else { userId = user.UserID } gdiskInfo, err := h.dal.GDisk.GetByUserID(r.Context(), userId) if err != nil { h.reportError(w, err, http.StatusInternalServerError) return } if gdiskInfo == nil { h.reportError(w, errors.New("gdisk info not found"), http.StatusForbidden) return } if gdiskInfo.Token() == nil { h.reportError(w, errors.New("google token invalid"), http.StatusForbidden) return } client, err := h.GDisk.NewClient(r.Context(), gdiskInfo.Token()) if err != nil { h.reportError(w, err, http.StatusInternalServerError) return } var res []*drive.File if resp.Name != "" { res, err = client.GetResourceByName(resp.Name, resp.ParentID) if err != nil { h.reportError(w, err, http.StatusInternalServerError) return } } dir, err := client.GetResources(res[0].Id) if err != nil { h.reportError(w, err, http.StatusInternalServerError) return } sendResponse(w, 200, dir) } // GDiskGetDirTemplate - возвращает данные по папке, включая список её файлов и папок func (h *Handlers) GDiskGetDirTemplate(w http.ResponseWriter, r *http.Request) { amoData := getAmoByJwt(r) user := getJwtUser(r) if amoData == nil && user == nil { h.reportError(w, errors.New("amo account not found"), http.StatusUnauthorized) return } var userId string if amoData != nil { userId = amoData.UserID } else { userId = user.UserID } gdiskInfo, err := h.dal.GDisk.GetByUserID(r.Context(), userId) if err != nil { h.reportError(w, err, http.StatusInternalServerError) return } if gdiskInfo == nil { h.reportError(w, errors.New("gdisk info not found"), http.StatusForbidden) return } if gdiskInfo.Token() == nil { h.reportError(w, errors.New("google token invalid"), http.StatusForbidden) return } client, err := h.GDisk.NewClient(r.Context(), gdiskInfo.Token()) if err != nil { h.reportError(w, err, http.StatusInternalServerError) return } dir, err := client.GetResources(gdiskInfo.TemplateFolderID) if err != nil { h.reportError(w, err, http.StatusInternalServerError) return } sendResponse(w, 200, dir) } func (h *Handlers) GDiskMkDir(w http.ResponseWriter, r *http.Request) { } func (h *Handlers) GDiskDelDir(w http.ResponseWriter, r *http.Request) { }