384 lines
10 KiB
Go
384 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, http.StatusInternalServerError)
|
|
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(), 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(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.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(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, http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
p, err := url.ParseQuery(string(reqBody))
|
|
if err != nil {
|
|
h.reportError(w, err, http.StatusBadRequest)
|
|
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, http.StatusInternalServerError)
|
|
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, http.StatusInternalServerError)
|
|
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)
|
|
}
|