docxTemplater/handlers/generator.go
Danil Solovyov fb5e03d888 Changes:
- little fixes
2022-11-21 20:07:49 +05:00

383 lines
10 KiB
Go

package handlers
import (
"errors"
"fmt"
"github.com/Pena-Co-Ltd/amocrm_templategen_back/amo"
"github.com/Pena-Co-Ltd/amocrm_templategen_back/templategen"
"io"
"net/http"
"net/url"
"strconv"
)
type ReqGeneratorByAmoLead struct {
File string `json:"file"` // Путь до файла в Yandex Disk, либо ID файла в Google Disk
StorageID string `json:"storage_id"`
StorageType string `json:"storage_type"`
LeadId int64 `json:"lead_id"` // Required.
}
// GeneratorByAmoLead - сгенерировать файл по lead_id и указанному файлу если он установлен,
// или по шаблону если файл не указан
func (h *Handlers) GeneratorByAmoLead(w http.ResponseWriter, r *http.Request) {
var req ReqGeneratorByAmoLead
amoData := getAmoByJwt(r)
if amoData == nil {
h.reportError(w, ErrorUnauthorized, http.StatusUnauthorized)
return
}
err := decodePost(&req, r)
if err != nil {
h.reportError(w, err, http.StatusBadRequest)
return
}
leadId := strconv.FormatInt(req.LeadId, 10)
if leadId == "" {
h.reportError(w, errors.New("lead_id required"), http.StatusBadRequest)
return
}
// Получить данные по лиду
amoClient, err := h.Amo.NewClient(r.Context(), amoData.Referer, amoData.Token(), "")
if err != nil {
h.reportError(w, err, http.StatusForbidden)
return
}
lead, err := amoClient.GetLeadById(leadId)
if err != nil {
h.reportError(w, err, 200)
return
}
if lead.Id == 0 {
fmt.Println("Lead empty")
}
dataTemplate := map[string]interface{}{}
// Добавляем Инфо Лида
for k, v := range templategen.AmoLeadFieldsToRuMap(lead) {
dataTemplate[k] = v
}
// Добавляем инфо контактов
contacts := []amo.Contact{}
for _, data := range lead.Embedded.Contacts {
contact, err := amoClient.GetContactById(strconv.Itoa(data.Id))
if err == nil {
contacts = append(contacts, *contact)
} else {
fmt.Println("Something Wrong1:", err)
}
}
dataTemplate["Контакты"] = templategen.AmoContactsFieldsToRuMap(contacts)
// Добавляем инфо компаний
companies := []amo.Company{}
for _, data := range lead.Embedded.Companies {
company, err := amoClient.GetCompanyById(strconv.Itoa(data.Id))
if err == nil {
companies = append(companies, *company)
} else {
fmt.Println("Something Wrong2:", err)
}
}
dataTemplate["Компании"] = templategen.AmoCompaniesFieldsToRuMap(companies)
var file, storageType, storageID, name string
if req.File != "" {
if req.StorageType == "" {
h.reportError(w, errors.New("storage required"), http.StatusBadRequest)
return
}
if req.StorageID == "" {
h.reportError(w, errors.New("storage_id required"), http.StatusBadRequest)
return
}
file = req.File
storageType = req.StorageType
storageID = req.StorageID
name = lead.Name
} else {
template, err := h.dal.Template.GetByLeadId(r.Context(), leadId)
if err != nil {
h.reportError(w, err, http.StatusInternalServerError)
return
}
if template == nil {
h.reportError(w, err, http.StatusNotFound)
return
}
file = template.File
storageType = template.StorageType
storageID = template.StorageID
name = template.Name
}
switch storageType {
case "gdisk":
gdiskData, err := h.dal.GDisk.GetByID(r.Context(), storageType)
if err != nil {
h.reportError(w, err, http.StatusInternalServerError)
return
}
if gdiskData == nil {
h.reportError(w, err, http.StatusInternalServerError)
return
}
client, err := h.GDisk.NewClient(r.Context(), gdiskData.Token())
err = templategen.GDiskGenerateDoc(file, name, amoData.UserID, gdiskData.SaveFolderID, client, dataTemplate)
if err != nil {
h.reportError(w, err, http.StatusInternalServerError)
return
}
case "yadisk":
yaDiskData, err := h.dal.YaDisk.GetByID(r.Context(), storageID)
if err != nil {
h.reportError(w, err, http.StatusInternalServerError)
return
}
client, err := h.YaDisk.NewClient(r.Context(), yaDiskData.Token(), "")
err = templategen.YaDiskGenerateDoc(file, name, amoData.UserID, yaDiskData.SaveFolder, client, dataTemplate)
if err != nil {
h.reportError(w, err, http.StatusInternalServerError)
return
}
default:
h.reportError(w, errors.New("got unknown storage"), http.StatusInternalServerError)
return
}
sendResponse(w, http.StatusOK, nil)
}
type ReqGeneratorByData struct {
File string `json:"file"`
StorageID string `json:"storage_id"`
StorageType string `json:"storage_type"`
TemplateID string `json:"template_id"`
Name string `json:"name"`
Data map[string]any `json:"data"`
}
// GeneratorByData - сгенерировать файл по данным и указанному файлу или шаблону
func (h *Handlers) GeneratorByData(w http.ResponseWriter, r *http.Request) {
var req ReqGeneratorByData
amoData := getAmoByJwt(r)
if amoData == nil {
h.reportError(w, ErrorUnauthorized, http.StatusUnauthorized)
return
}
err := decodePost(&req, r)
if err != nil {
h.reportError(w, err, http.StatusBadRequest)
return
}
if req.StorageType == "" {
h.reportError(w, errors.New("storage required"), http.StatusBadRequest)
return
}
if req.StorageID == "" {
h.reportError(w, errors.New("storage_id required"), http.StatusBadRequest)
return
}
switch req.StorageType {
case "gdisk":
gdiskData, err := h.dal.GDisk.GetByID(r.Context(), req.StorageType)
if err != nil {
h.reportError(w, err, http.StatusInternalServerError)
return
}
if gdiskData == nil {
h.reportError(w, err, http.StatusInternalServerError)
return
}
client, err := h.GDisk.NewClient(r.Context(), gdiskData.Token())
err = templategen.GDiskGenerateDoc(req.File, req.Name, amoData.UserID, gdiskData.SaveFolderID, client, req.Data)
if err != nil {
h.reportError(w, err, http.StatusInternalServerError)
return
}
case "yadisk":
yaDiskData, err := h.dal.YaDisk.GetByID(r.Context(), req.StorageID)
if err != nil {
h.reportError(w, err, http.StatusInternalServerError)
return
}
client, err := h.YaDisk.NewClient(r.Context(), yaDiskData.Token(), "")
err = templategen.YaDiskGenerateDoc(req.File, req.Name, amoData.UserID, yaDiskData.SaveFolder, client,
req.Data)
if err != nil {
h.reportError(w, err, http.StatusInternalServerError)
return
}
default:
h.reportError(w, errors.New("got unknown storage"), http.StatusInternalServerError)
return
}
sendResponse(w, http.StatusOK, nil)
}
// GeneratorByAmoWebhook - эндпоинт для вебхука amo. Генерирует файл по ранее заданному шаблону
func (h *Handlers) GeneratorByAmoWebhook(w http.ResponseWriter, r *http.Request) {
reqBody, err := io.ReadAll(r.Body)
if err != nil {
h.reportError(w, err, 200)
return
}
p, err := url.ParseQuery(string(reqBody))
if err != nil {
h.reportError(w, err, 200)
return
}
leadId := p.Get("leads[status][0][id]")
subdomain := p.Get("account[subdomain]")
accId := p.Get("account[id]")
// Запрашиваем данные по аккаунту
amoData, err := h.dal.Amo.GetByAccountID(r.Context(), accId)
if err != nil {
h.reportError(w, err, 200)
return
}
amoClient, err := h.Amo.NewClient(r.Context(), subdomain, amoData.Token(), "")
if err != nil {
h.reportError(w, err, http.StatusForbidden)
return
}
lead, err := amoClient.GetLeadById(leadId)
if err != nil {
h.reportError(w, err, 200)
return
}
if lead != nil {
// fmt.Printf("Lead RESP:%+v\r\n", lead)
} else {
fmt.Println("Lead empty")
}
dataTemplate := map[string]interface{}{}
// Добавляем Инфо Лида
for k, v := range templategen.AmoLeadFieldsToRuMap(lead) {
dataTemplate[k] = v
}
//filename := fmt.Sprintf("%v", dataTemplate["Filename"])
// Добавялем инфо контактов
contacts := []amo.Contact{}
for _, data := range lead.Embedded.Contacts {
contact, err := amoClient.GetContactById(strconv.Itoa(data.Id))
if err == nil {
contacts = append(contacts, *contact)
} else {
fmt.Println("Something Wrong1:", err)
}
}
dataTemplate["Контакты"] = templategen.AmoContactsFieldsToRuMap(contacts)
// Добавляем инфо компаний
companies := []amo.Company{}
for _, data := range lead.Embedded.Companies {
company, err := amoClient.GetCompanyById(strconv.Itoa(data.Id))
if err == nil {
companies = append(companies, *company)
} else {
fmt.Println("Something Wrong2:", err)
}
}
dataTemplate["Компании"] = templategen.AmoCompaniesFieldsToRuMap(companies)
template, err := h.dal.Template.GetByLeadId(r.Context(), leadId)
if err != nil {
h.reportError(w, err, http.StatusInternalServerError)
return
}
if template == nil {
h.reportError(w, err, http.StatusNotFound)
return
}
switch template.StorageType {
case "gdisk":
gdiskData, err := h.dal.GDisk.GetByID(r.Context(), template.StorageID)
if err != nil {
h.reportError(w, err, http.StatusInternalServerError)
return
}
if gdiskData == nil {
h.reportError(w, err, http.StatusInternalServerError)
return
}
client, err := h.GDisk.NewClient(r.Context(), gdiskData.Token())
err = templategen.GDiskGenerateDoc(template.File, template.Name, amoData.UserID, gdiskData.SaveFolderID, client,
dataTemplate)
if err != nil {
h.reportError(w, err, http.StatusInternalServerError)
return
}
case "yadisk":
yaDiskData, err := h.dal.YaDisk.GetByID(r.Context(), template.StorageID)
if err != nil {
h.reportError(w, err, http.StatusInternalServerError)
return
}
client, err := h.YaDisk.NewClient(r.Context(), yaDiskData.Token(), "")
err = templategen.YaDiskGenerateDoc(template.File, template.Name, amoData.UserID, yaDiskData.SaveFolder, client, dataTemplate)
if err != nil {
h.reportError(w, err, http.StatusInternalServerError)
return
}
default:
h.reportError(w, errors.New("got unknown storage"), http.StatusInternalServerError)
return
}
sendResponse(w, 200, nil)
}