MMO 서버/데디케이트 서버 연동을 위한 내부 API 엔드포인트 구현: - POST /api/internal/bossraid/entry — 파티 입장 요청 (방 생성) - POST /api/internal/bossraid/start — 세션 시작 보고 - POST /api/internal/bossraid/complete — 클리어 보고 + TOL Chain 보상 지급 - POST /api/internal/bossraid/fail — 실패 보고 - GET /api/internal/bossraid/room — 방 조회 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
141
internal/bossraid/handler.go
Normal file
141
internal/bossraid/handler.go
Normal file
@@ -0,0 +1,141 @@
|
||||
package bossraid
|
||||
|
||||
import (
|
||||
"log"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
)
|
||||
|
||||
type Handler struct {
|
||||
svc *Service
|
||||
}
|
||||
|
||||
func NewHandler(svc *Service) *Handler {
|
||||
return &Handler{svc: svc}
|
||||
}
|
||||
|
||||
func bossError(c *fiber.Ctx, status int, userMsg string, err error) error {
|
||||
log.Printf("bossraid error: %s: %v", userMsg, err)
|
||||
return c.Status(status).JSON(fiber.Map{"error": userMsg})
|
||||
}
|
||||
|
||||
// RequestEntry handles POST /api/internal/bossraid/entry
|
||||
// Called by MMO server when a party requests boss raid entry.
|
||||
func (h *Handler) RequestEntry(c *fiber.Ctx) error {
|
||||
var req struct {
|
||||
Usernames []string `json:"usernames"`
|
||||
BossID int `json:"bossId"`
|
||||
}
|
||||
if err := c.BodyParser(&req); err != nil {
|
||||
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "잘못된 요청입니다"})
|
||||
}
|
||||
if len(req.Usernames) == 0 || req.BossID <= 0 {
|
||||
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "usernames와 bossId는 필수입니다"})
|
||||
}
|
||||
|
||||
room, err := h.svc.RequestEntry(req.Usernames, req.BossID)
|
||||
if err != nil {
|
||||
return bossError(c, fiber.StatusConflict, err.Error(), err)
|
||||
}
|
||||
|
||||
return c.Status(fiber.StatusCreated).JSON(fiber.Map{
|
||||
"roomId": room.ID,
|
||||
"sessionName": room.SessionName,
|
||||
"bossId": room.BossID,
|
||||
"players": req.Usernames,
|
||||
"status": room.Status,
|
||||
})
|
||||
}
|
||||
|
||||
// StartRaid handles POST /api/internal/bossraid/start
|
||||
// Called by dedicated server when the Fusion session begins.
|
||||
func (h *Handler) StartRaid(c *fiber.Ctx) error {
|
||||
var req struct {
|
||||
SessionName string `json:"sessionName"`
|
||||
}
|
||||
if err := c.BodyParser(&req); err != nil {
|
||||
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "잘못된 요청입니다"})
|
||||
}
|
||||
if req.SessionName == "" {
|
||||
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "sessionName은 필수입니다"})
|
||||
}
|
||||
|
||||
room, err := h.svc.StartRaid(req.SessionName)
|
||||
if err != nil {
|
||||
return bossError(c, fiber.StatusBadRequest, err.Error(), err)
|
||||
}
|
||||
|
||||
return c.JSON(fiber.Map{
|
||||
"roomId": room.ID,
|
||||
"sessionName": room.SessionName,
|
||||
"status": room.Status,
|
||||
})
|
||||
}
|
||||
|
||||
// CompleteRaid handles POST /api/internal/bossraid/complete
|
||||
// Called by dedicated server when the boss is killed. Distributes rewards.
|
||||
func (h *Handler) CompleteRaid(c *fiber.Ctx) error {
|
||||
var req struct {
|
||||
SessionName string `json:"sessionName"`
|
||||
Rewards []PlayerReward `json:"rewards"`
|
||||
}
|
||||
if err := c.BodyParser(&req); err != nil {
|
||||
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "잘못된 요청입니다"})
|
||||
}
|
||||
if req.SessionName == "" {
|
||||
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "sessionName은 필수입니다"})
|
||||
}
|
||||
|
||||
room, results, err := h.svc.CompleteRaid(req.SessionName, req.Rewards)
|
||||
if err != nil {
|
||||
return bossError(c, fiber.StatusBadRequest, err.Error(), err)
|
||||
}
|
||||
|
||||
return c.JSON(fiber.Map{
|
||||
"roomId": room.ID,
|
||||
"sessionName": room.SessionName,
|
||||
"status": room.Status,
|
||||
"rewardResults": results,
|
||||
})
|
||||
}
|
||||
|
||||
// FailRaid handles POST /api/internal/bossraid/fail
|
||||
// Called by dedicated server on timeout or party wipe.
|
||||
func (h *Handler) FailRaid(c *fiber.Ctx) error {
|
||||
var req struct {
|
||||
SessionName string `json:"sessionName"`
|
||||
}
|
||||
if err := c.BodyParser(&req); err != nil {
|
||||
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "잘못된 요청입니다"})
|
||||
}
|
||||
if req.SessionName == "" {
|
||||
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "sessionName은 필수입니다"})
|
||||
}
|
||||
|
||||
room, err := h.svc.FailRaid(req.SessionName)
|
||||
if err != nil {
|
||||
return bossError(c, fiber.StatusBadRequest, err.Error(), err)
|
||||
}
|
||||
|
||||
return c.JSON(fiber.Map{
|
||||
"roomId": room.ID,
|
||||
"sessionName": room.SessionName,
|
||||
"status": room.Status,
|
||||
})
|
||||
}
|
||||
|
||||
// GetRoom handles GET /api/internal/bossraid/room
|
||||
// Query param: sessionName
|
||||
func (h *Handler) GetRoom(c *fiber.Ctx) error {
|
||||
sessionName := c.Query("sessionName")
|
||||
if sessionName == "" {
|
||||
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "sessionName은 필수입니다"})
|
||||
}
|
||||
|
||||
room, err := h.svc.GetRoom(sessionName)
|
||||
if err != nil {
|
||||
return bossError(c, fiber.StatusNotFound, "방을 찾을 수 없습니다", err)
|
||||
}
|
||||
|
||||
return c.JSON(room)
|
||||
}
|
||||
Reference in New Issue
Block a user