Implement FCM

This commit is contained in:
2026-05-09 14:11:21 +07:00
parent 07b186c986
commit 6a2ce75a8e
18 changed files with 397 additions and 44 deletions
+33
View File
@@ -1,6 +1,7 @@
package handler
import (
"apskel-pos-be/internal/client"
"apskel-pos-be/internal/constants"
"apskel-pos-be/internal/contract"
"apskel-pos-be/internal/entities"
@@ -14,6 +15,7 @@ import (
"apskel-pos-be/internal/util"
"context"
"fmt"
"log"
"github.com/gin-gonic/gin"
"github.com/google/uuid"
@@ -28,6 +30,7 @@ type SelfOrderHandler struct {
userRepo processor.UserRepository
sessionRepo repository.SessionRepository
orderRepo repository.OrderRepository
fcmClient client.FcmClient
}
func NewSelfOrderHandler(
@@ -39,6 +42,7 @@ func NewSelfOrderHandler(
userRepo processor.UserRepository,
sessionRepo repository.SessionRepository,
orderRepo repository.OrderRepository,
fcmClient client.FcmClient,
) *SelfOrderHandler {
return &SelfOrderHandler{
orderService: orderService,
@@ -49,6 +53,7 @@ func NewSelfOrderHandler(
userRepo: userRepo,
sessionRepo: sessionRepo,
orderRepo: orderRepo,
fcmClient: fcmClient,
}
}
@@ -351,10 +356,38 @@ func (h *SelfOrderHandler) CreateOrder(c *gin.Context) {
return
}
go h.sendNewOrderNotification(context.Background(), table.OrganizationID, table.TableName, len(req.OrderItems))
contractResp := transformer.OrderModelToContract(response)
util.HandleResponse(c.Writer, c.Request, contract.BuildSuccessResponse(contractResp), "SelfOrderHandler::CreateOrder")
}
func (h *SelfOrderHandler) sendNewOrderNotification(ctx context.Context, organizationID uuid.UUID, tableName string, itemCount int) {
users, err := h.userRepo.GetUsersWithFcmTokenByOrganization(ctx, organizationID)
if err != nil {
log.Printf("SelfOrderHandler::sendNewOrderNotification -> failed to get users with FCM token: %v", err)
return
}
tokens := make([]string, 0, len(users))
for _, u := range users {
if u.FcmToken != nil && *u.FcmToken != "" {
tokens = append(tokens, *u.FcmToken)
}
}
if len(tokens) == 0 {
return
}
title := "Order Baru"
body := fmt.Sprintf("Order baru dari Meja %s — %d item", tableName, itemCount)
if err := h.fcmClient.SendMulticastNotification(ctx, tokens, title, body); err != nil {
log.Printf("SelfOrderHandler::sendNewOrderNotification -> failed to send FCM notification: %v", err)
}
}
func (h *SelfOrderHandler) GetOrdersBySession(c *gin.Context) {
ctx := c.Request.Context()
sessionID := c.Param("sessionId")