Files
verify/backend/internal/router/developer/announcements.go
T
2026-04-27 17:22:56 +08:00

191 lines
5.2 KiB
Go

package developer
import (
"fmt"
"log"
"strconv"
"verification-platform-backend/internal/database"
"verification-platform-backend/internal/model"
"verification-platform-backend/internal/service"
"verification-platform-backend/pkg/response"
"github.com/gin-gonic/gin"
)
func SetupAnnouncementRoutes(r *gin.RouterGroup) {
announcements := r.Group("/announcements")
{
announcements.GET("", handleGetAllAnnouncements)
announcements.GET("/:id", handleGetAnnouncementByID)
announcements.DELETE("/batch", handleBatchDeleteAnnouncements)
}
}
func handleGetAllAnnouncements(c *gin.Context) {
userID := c.GetUint("user_id")
log.Printf("[DEBUG] handleGetAllAnnouncements called, userID: %d\n", userID)
page := c.DefaultQuery("page", "1")
pageSize := c.DefaultQuery("page_size", "20")
var total int64
var userApps []model.Application
if err := database.DB.Where("user_id = ?", userID).Find(&userApps).Error; err != nil {
response.Error(c, 500, "获取应用列表失败")
return
}
log.Printf("[DEBUG] Found %d user apps\n", len(userApps))
for i, app := range userApps {
log.Printf("[DEBUG] App %d: ID=%d, Name=%s\n", i, app.ID, app.Name)
}
if len(userApps) == 0 {
response.Success(c, gin.H{
"announcements": []interface{}{},
"total": 0,
})
return
}
appIDs := make([]uint, len(userApps))
appNameMap := make(map[uint]string)
for i, app := range userApps {
appIDs[i] = app.ID
appNameMap[app.ID] = app.Name
}
log.Printf("[DEBUG] appNameMap: %v\n", appNameMap)
database.DB.Model(&model.Announcement{}).Where("application_id IN ?", appIDs).Count(&total)
var announcements []model.Announcement
offset := 0
if pageInt, err := strconv.Atoi(page); err == nil && pageInt > 1 {
offset = (pageInt - 1) * 20
}
limit := 20
if pageSizeInt, err := strconv.Atoi(pageSize); err == nil && pageSizeInt > 0 {
limit = pageSizeInt
}
if err := database.DB.Where("application_id IN ?", appIDs).Order("is_top DESC, created_at DESC").Limit(limit).Offset(offset).Find(&announcements).Error; err != nil {
response.Error(c, 500, "获取公告列表失败")
return
}
log.Printf("[DEBUG] Found %d announcements\n", len(announcements))
for i, a := range announcements {
log.Printf("[DEBUG] Announcement %d: ID=%d, ApplicationID=%d, Title=%s\n", i, a.ID, a.ApplicationID, a.Title)
}
type AnnouncementWithAppName struct {
model.Announcement
ApplicationName string `json:"application_name"`
}
result := make([]AnnouncementWithAppName, len(announcements))
for i, a := range announcements {
appName := appNameMap[a.ApplicationID]
result[i] = AnnouncementWithAppName{
Announcement: a,
ApplicationName: appName,
}
}
response.Success(c, gin.H{
"announcements": result,
"total": total,
})
}
func handleGetAnnouncementByID(c *gin.Context) {
userID := c.GetUint("user_id")
announcementID := c.Param("id")
var userApps []model.Application
if err := database.DB.Where("user_id = ?", userID).Find(&userApps).Error; err != nil {
response.Error(c, 500, "获取应用列表失败")
return
}
appIDs := make([]uint, len(userApps))
appNameMap := make(map[uint]string)
for i, app := range userApps {
appIDs[i] = app.ID
appNameMap[app.ID] = app.Name
}
var announcement model.Announcement
if err := database.DB.Where("id = ? AND application_id IN ?", announcementID, appIDs).First(&announcement).Error; err != nil {
response.Error(c, 404, "公告不存在")
return
}
response.Success(c, gin.H{
"id": announcement.ID,
"application_id": announcement.ApplicationID,
"application_name": appNameMap[announcement.ApplicationID],
"title": announcement.Title,
"content": announcement.Content,
"type": announcement.Type,
"status": announcement.Status,
"is_top": announcement.IsTop,
"created_at": announcement.CreatedAt,
"updated_at": announcement.UpdatedAt,
})
}
func handleBatchDeleteAnnouncements(c *gin.Context) {
userID := c.GetUint("user_id")
var req struct {
IDs []uint `json:"ids"`
}
if err := c.ShouldBindJSON(&req); err != nil {
response.Error(c, 400, "参数错误")
return
}
if len(req.IDs) == 0 {
response.Error(c, 400, "请选择要删除的公告")
return
}
var userApps []model.Application
if err := database.DB.Where("user_id = ?", userID).Find(&userApps).Error; err != nil {
response.Error(c, 500, "获取应用列表失败")
return
}
appIDs := make([]uint, len(userApps))
for i, app := range userApps {
appIDs[i] = app.ID
}
var announcements []model.Announcement
if err := database.DB.Where("id IN ? AND application_id IN ?", req.IDs, appIDs).Find(&announcements).Error; err != nil {
response.Error(c, 500, "获取公告失败")
return
}
for _, announcement := range announcements {
for _, app := range userApps {
if app.ID == announcement.ApplicationID && service.GetApplicationDisabledStatus(app.ID) {
response.Error(c, 403, fmt.Sprintf("应用 %s 已被禁用,无法删除其公告", app.Name))
return
}
}
}
if err := database.DB.Where("id IN ? AND application_id IN ?", req.IDs, appIDs).Delete(&model.Announcement{}).Error; err != nil {
response.Error(c, 500, "批量删除公告失败")
return
}
response.Success(c, nil)
}