Initial commit: 网络验证平台
This commit is contained in:
@@ -0,0 +1,190 @@
|
||||
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)
|
||||
}
|
||||
Reference in New Issue
Block a user