package com.linhelp.groupbuy; import com.linhelp.common.api.ApiResponse; import com.linhelp.common.api.PageResponse; import com.linhelp.common.enums.GroupBuyOrderStatus; import com.linhelp.common.security.AuthService; import com.linhelp.common.security.CurrentUser; import com.linhelp.common.security.RequireRole; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import javax.validation.Valid; import java.util.List; @RestController public class GroupBuyController { private final GroupBuyService groupBuyService; private final GroupBuyOrderService orderService; private final AuthService authService; public GroupBuyController(GroupBuyService groupBuyService, GroupBuyOrderService orderService, AuthService authService) { this.groupBuyService = groupBuyService; this.orderService = orderService; this.authService = authService; } @GetMapping("/api/admin/group-buys") @RequireRole({"PLATFORM_ADMIN", "COMMUNITY_ADMIN", "MERCHANT"}) public ApiResponse> listAdmin() { CurrentUser user = authService.currentUser(); return ApiResponse.ok(groupBuyService.listAdmin(user.getCommunityId())); } @PostMapping("/api/admin/group-buys") @RequireRole({"PLATFORM_ADMIN", "COMMUNITY_ADMIN", "MERCHANT"}) public ApiResponse create(@Valid @RequestBody GroupBuyRequest request) { CurrentUser user = authService.currentUser(); request.setTenantId(user.getTenantId()); request.setCommunityId(user.getCommunityId()); return ApiResponse.ok(groupBuyService.create(request)); } @PutMapping("/api/admin/group-buys/{id}") @RequireRole({"PLATFORM_ADMIN", "COMMUNITY_ADMIN", "MERCHANT"}) public ApiResponse update(@PathVariable Long id, @Valid @RequestBody GroupBuyRequest request) { CurrentUser user = authService.currentUser(); request.setTenantId(user.getTenantId()); request.setCommunityId(user.getCommunityId()); return ApiResponse.ok(groupBuyService.updateAdmin(user.getCommunityId(), id, request)); } @PutMapping("/api/admin/group-buys/{id}/start") @RequireRole({"PLATFORM_ADMIN", "COMMUNITY_ADMIN", "MERCHANT"}) public ApiResponse start(@PathVariable Long id) { CurrentUser user = authService.currentUser(); return ApiResponse.ok(groupBuyService.startAdmin(user.getCommunityId(), id)); } @PutMapping("/api/admin/group-buys/{id}/close") @RequireRole({"PLATFORM_ADMIN", "COMMUNITY_ADMIN", "MERCHANT"}) public ApiResponse close(@PathVariable Long id) { CurrentUser user = authService.currentUser(); return ApiResponse.ok(groupBuyService.closeAdmin(user.getCommunityId(), id)); } @PutMapping("/api/admin/group-buys/{id}/complete") @RequireRole({"PLATFORM_ADMIN", "COMMUNITY_ADMIN", "MERCHANT"}) public ApiResponse completeGroupBuy(@PathVariable Long id) { CurrentUser user = authService.currentUser(); return ApiResponse.ok(groupBuyService.completeAdmin(user.getCommunityId(), id)); } @GetMapping("/api/admin/group-buys/{id}/orders") @RequireRole({"PLATFORM_ADMIN", "COMMUNITY_ADMIN", "MERCHANT"}) public ApiResponse> listOrders(@PathVariable Long id) { CurrentUser user = authService.currentUser(); return ApiResponse.ok(orderService.listByGroupBuyAdmin(user.getCommunityId(), id)); } @GetMapping("/api/admin/group-buys/{id}/orders/page") @RequireRole({"PLATFORM_ADMIN", "COMMUNITY_ADMIN", "MERCHANT"}) public ApiResponse> pageOrders(@PathVariable Long id, @RequestParam(required = false) GroupBuyOrderStatus status, @RequestParam(required = false) Integer pageNo, @RequestParam(required = false) Integer pageSize) { CurrentUser user = authService.currentUser(); return ApiResponse.ok(orderService.listByGroupBuyAdminPage(user.getCommunityId(), id, status, pageNo, pageSize)); } @GetMapping("/api/admin/group-buy-orders/page") @RequireRole({"PLATFORM_ADMIN", "COMMUNITY_ADMIN", "MERCHANT"}) public ApiResponse> pageAllOrders(@RequestParam(required = false) GroupBuyOrderStatus status, @RequestParam(required = false) Integer pageNo, @RequestParam(required = false) Integer pageSize) { CurrentUser user = authService.currentUser(); return ApiResponse.ok(orderService.listAdminPage(user.getCommunityId(), status, pageNo, pageSize)); } @PutMapping("/api/admin/group-buy-orders/{id}/confirm") @RequireRole({"PLATFORM_ADMIN", "COMMUNITY_ADMIN", "MERCHANT"}) public ApiResponse confirmOrder(@PathVariable Long id) { CurrentUser user = authService.currentUser(); return ApiResponse.ok(orderService.confirmAdmin(user.getCommunityId(), id, user.getUserId())); } @PutMapping("/api/admin/group-buy-orders/{id}/ready") @RequireRole({"PLATFORM_ADMIN", "COMMUNITY_ADMIN", "MERCHANT"}) public ApiResponse markOrderReady(@PathVariable Long id) { CurrentUser user = authService.currentUser(); return ApiResponse.ok(orderService.markReadyAdmin(user.getCommunityId(), id)); } @GetMapping("/api/mini/group-buys") public ApiResponse> listMini() { CurrentUser user = authService.currentUser(); return ApiResponse.ok(groupBuyService.listMini(user.getCommunityId())); } @GetMapping("/api/mini/group-buys/{id}") public ApiResponse detail(@PathVariable Long id) { CurrentUser user = authService.currentUser(); return ApiResponse.ok(groupBuyService.detailMini(user.getCommunityId(), id)); } @PostMapping("/api/mini/group-buy-orders") public ApiResponse createOrder(@Valid @RequestBody GroupBuyOrderRequest request) { CurrentUser user = authService.currentUser(); request.setTenantId(user.getTenantId()); request.setCommunityId(user.getCommunityId()); return ApiResponse.ok(orderService.create(user.getUserId(), request)); } @GetMapping("/api/mini/group-buy-orders") public ApiResponse> listMine() { CurrentUser user = authService.currentUser(); return ApiResponse.ok(orderService.listMine(user.getUserId())); } @GetMapping("/api/mini/group-buy-orders/{id}") public ApiResponse orderDetail(@PathVariable Long id) { CurrentUser user = authService.currentUser(); return ApiResponse.ok(orderService.detailMine(user.getUserId(), id)); } @PutMapping("/api/mini/group-buy-orders/{id}/cancel") public ApiResponse cancel(@PathVariable Long id) { CurrentUser user = authService.currentUser(); return ApiResponse.ok(orderService.cancelMine(user.getUserId(), id)); } @PutMapping("/api/mini/group-buy-orders/{id}/complete") public ApiResponse completeOrder(@PathVariable Long id) { CurrentUser user = authService.currentUser(); return ApiResponse.ok(orderService.completeMine(user.getUserId(), id)); } }