All checks were successful
		
		
	
	continuous-integration/drone/push Build is passing
				
			
		
			
				
	
	
		
			112 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			112 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package app
 | ||
| 
 | ||
| import (
 | ||
| 	"bytes"
 | ||
| 	"cake_crm/internal/modules/messenger"
 | ||
| 	"cake_crm/internal/modules/storage"
 | ||
| 	"cake_crm/internal/services/card"
 | ||
| 	proto "cake_crm/proto"
 | ||
| 	"context"
 | ||
| 	"errors"
 | ||
| 	"fmt"
 | ||
| )
 | ||
| 
 | ||
| type Server struct {
 | ||
| 	proto.UnsafeCRMServer
 | ||
| 	storage     storage.IStorage
 | ||
| 	messenger   messenger.IMessenger
 | ||
| 	cardService *card.Service
 | ||
| }
 | ||
| 
 | ||
| func NewServer(storage storage.IStorage, messenger messenger.IMessenger, cardService *card.Service) proto.CRMServer {
 | ||
| 	return &Server{
 | ||
| 		storage:     storage,
 | ||
| 		messenger:   messenger,
 | ||
| 		cardService: cardService,
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| func (s *Server) GetCatalog(ctx context.Context, _ *proto.GetCatalogReq) (*proto.CatalogRsp, error) {
 | ||
| 	categories, err := s.storage.GetCatalog(ctx)
 | ||
| 	if err != nil {
 | ||
| 		return nil, err
 | ||
| 	}
 | ||
| 	return &proto.CatalogRsp{Categories: categories}, nil
 | ||
| }
 | ||
| 
 | ||
| func (s *Server) GetPositions(ctx context.Context, req *proto.GetPositionsReq) (*proto.PositionsRsp, error) {
 | ||
| 	products, err := s.storage.GetPositions(ctx, req.Id)
 | ||
| 	if err != nil {
 | ||
| 		return nil, err
 | ||
| 	}
 | ||
| 	return &proto.PositionsRsp{Products: products}, nil
 | ||
| }
 | ||
| 
 | ||
| func (s *Server) GetProduct(ctx context.Context, req *proto.GetProductReq) (*proto.ProductRsp, error) {
 | ||
| 	product, err := s.storage.GetProduct(ctx, req.Id)
 | ||
| 	if err != nil {
 | ||
| 		return nil, err
 | ||
| 	}
 | ||
| 	return &proto.ProductRsp{Product: product}, nil
 | ||
| }
 | ||
| 
 | ||
| func (s *Server) GetBreadcrumbs(ctx context.Context, req *proto.GetBreadcrumbsReq) (*proto.BreadcrumbsRsp, error) {
 | ||
| 	breadcrumbs, err := s.storage.GetBreadcrumbs(ctx, req.Id)
 | ||
| 	if err != nil {
 | ||
| 		return nil, err
 | ||
| 	}
 | ||
| 	return &proto.BreadcrumbsRsp{Categories: breadcrumbs}, nil
 | ||
| }
 | ||
| 
 | ||
| func (s *Server) Order(ctx context.Context, req *proto.OrderReq) (*proto.OrderRsp, error) {
 | ||
| 	enrichItems, err := s.cardService.GetCard(ctx, req.Order.Items)
 | ||
| 	if err != nil {
 | ||
| 		return nil, err
 | ||
| 	}
 | ||
| 	text, err := createOrderText(req, enrichItems)
 | ||
| 	if err != nil {
 | ||
| 		return nil, err
 | ||
| 	}
 | ||
| 	return &proto.OrderRsp{}, s.messenger.SendMessage(text)
 | ||
| }
 | ||
| 
 | ||
| func createOrderText(req *proto.OrderReq, items []*proto.CardItem) (string, error) {
 | ||
| 	buffer := bytes.Buffer{}
 | ||
| 	var orderAmount int64
 | ||
| 	buffer.WriteString(fmt.Sprintf("Заказ от:\n%s\n%s\n", req.Name, req.Phone))
 | ||
| 	buffer.WriteString("\n")
 | ||
| 	for _, item := range items {
 | ||
| 		buffer.WriteString(item.Name)
 | ||
| 		buffer.WriteString("\n")
 | ||
| 		unit, err := unitToText(item.Unit)
 | ||
| 		if err != nil {
 | ||
| 			return "", err
 | ||
| 		}
 | ||
| 		buffer.WriteString(fmt.Sprintf("Количество: %d%s\n", item.Count, unit))
 | ||
| 		orderAmount += item.Amount
 | ||
| 		buffer.WriteString(fmt.Sprintf("Сумма: %.00fр\n", float64(item.Amount)/100))
 | ||
| 		buffer.WriteString("\n")
 | ||
| 	}
 | ||
| 	buffer.WriteString("\n")
 | ||
| 	buffer.WriteString(fmt.Sprintf("ИТОГО: %.00fр\n", float64(orderAmount)/100))
 | ||
| 	return buffer.String(), nil
 | ||
| }
 | ||
| 
 | ||
| func unitToText(unit string) (string, error) {
 | ||
| 	switch unit {
 | ||
| 	case "kg":
 | ||
| 		return "кг", nil
 | ||
| 	case "piece":
 | ||
| 		return "шт", nil
 | ||
| 	}
 | ||
| 	return "", errors.New("unit not found")
 | ||
| }
 | ||
| 
 | ||
| func (s *Server) GetCard(ctx context.Context, req *proto.CardReq) (*proto.CardRsp, error) {
 | ||
| 	enrichItems, err := s.cardService.GetCard(ctx, req.Items)
 | ||
| 	if err != nil {
 | ||
| 		return nil, err
 | ||
| 	}
 | ||
| 	return &proto.CardRsp{Items: enrichItems}, nil
 | ||
| }
 |