package api import ( "fmt" "log/slog" "net/http" "strconv" jwt "github.com/appleboy/gin-jwt/v2" "github.com/gin-gonic/gin" "joylink.club/bj-rtsts-server/db/model" "joylink.club/bj-rtsts-server/dto" "joylink.club/bj-rtsts-server/middleware" "joylink.club/bj-rtsts-server/service" "joylink.club/bj-rtsts-server/sys_error" "joylink.club/bj-rtsts-server/ts/simulation/wayside/memory" ) func InitPublishedGiRouter(api *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { authed := api.Group("/v1/publishedGi").Use(authMiddleware.MiddlewareFunc(), middleware.PermissMiddleware) authed.GET("/paging", pageQueryPublishedGi) authed.GET("/list", listQueryPublishedGi) authed.GET("/:id", getPublishedGiById) authed.POST("/publish", publishFromDraft) authed.DELETE("/:id", deletePublishedGiById) authed.POST("/saveAsDrafting/:id", saveAsDraftingFromPublish) authed.GET("/name", getPublishedGiByName) authed.POST("/release", releasePublishedGiById) authed.POST("/rename", renamePublishedGiById) authed.GET("/:id/history", historyPublishedGiById) authed.POST("/fallbackVersion", fallbackCurrentVersion) } // 分页查询发布的图形数据 // // @Summary 分页查询发布的图形数据 // // @Security JwtAuth // // @Description 可以通过名称过滤 // @Tags 发布的图形数据Api // @Accept json // @Produce json // @Param pagePublishedReqDto query dto.PagePublishedReqDto true "分页查询参数" // @Success 200 {object} dto.PageDto // @Failure 401 {object} dto.ErrorDto // @Failure 500 {object} dto.ErrorDto // @Router /api/v1/publishedGi/paging [get] func pageQueryPublishedGi(c *gin.Context) { req := dto.PagePublishedReqDto{} if err := c.ShouldBind(&req); err != nil { panic(sys_error.New("查询失败,查询参数格式错误", err)) } page := service.PageQueryPublished(&req) c.JSON(http.StatusOK, page) } // 列表查询发布的图形数据 // // @Summary 列表查询发布的图形数据 // // @Security JwtAuth // // @Description 可以通过名称过滤 // @Tags 发布的图形数据Api // @Accept json // @Produce json // @Param publishedListReqDto query dto.PublishedListReqDto true "查询参数" // @Success 200 {object} []model.Published // @Failure 401 {object} dto.ErrorDto // @Failure 500 {object} dto.ErrorDto // @Router /api/v1/publishedGi/list [get] func listQueryPublishedGi(c *gin.Context) { req := dto.PublishedListReqDto{} if err := c.ShouldBindQuery(&req); err != nil { panic(sys_error.New("查询失败,查询参数格式错误", err)) } list := service.ListQueryPublished(&req) c.JSON(http.StatusOK, list) } // id 查询发布的图形数据 // // @Summary id查询发布的图形数据 // // @Security JwtAuth // // @Description 可以通过名称过滤 // @Tags 发布的图形数据Api // @Accept json // @Produce json // @Param id path int true "id" // @Success 200 {object} dto.PublishedDto // @Failure 401 {object} dto.ErrorDto // @Failure 500 {object} dto.ErrorDto // @Router /api/v1/publishedGi/{id} [get] func getPublishedGiById(c *gin.Context) { idStr := c.Param("id") id, err := strconv.Atoi(idStr) if err != nil { panic(sys_error.New("查询失败,传入参数格式错误", err)) } entity := service.GetPublishedById(int32(id)) c.JSON(http.StatusOK, entity) } // 从草稿发布数据 // // @Summary 从草稿发布数据 // // @Security JwtAuth // // @Description // @Tags 发布的图形数据Api // @Accept json // @Produce json // @Param PublishReqDto query dto.PublishReqDto true "查询参数" // @Success 200 // @Failure 401 {object} dto.ErrorDto // @Failure 500 {object} dto.ErrorDto // @Router /api/v1/publishedGi/publish [post] func publishFromDraft(c *gin.Context) { user, _ := c.Get(middleware.IdentityKey) slog.Debug("发布图形数据", user) req := dto.PublishReqDto{} if err := c.ShouldBind(&req); err != nil { panic(sys_error.New("发布失败,参数格式错误", err)) } mid := service.PublishFormDraft(&req, user.(*model.User)) memory.DeleteMapVerifyStructure(mid) // 清除缓存,需要重新查询 } // id 删除发布的图形数据 // // @Summary id删除发布的图形数据 // // @Security JwtAuth // // @Description 可以通过名称过滤 // @Tags 发布的图形数据Api // @Accept json // @Produce json // @Param id path int true "id" // @Success 200 {object} nil // @Failure 401 {object} dto.ErrorDto // @Failure 500 {object} dto.ErrorDto // @Router /api/v1/publishedGi/{id} [delete] func deletePublishedGiById(c *gin.Context) { idStr := c.Param("id") id, err := strconv.Atoi(idStr) if err != nil { panic(sys_error.New("删除失败,传入参数格式错误", err)) } mid := int32(id) service.DeletePublishedById(mid) memory.DeleteMapVerifyStructure(mid) // 移除内存中的发布信息 } // id 从发布数据拉取信息到草稿 // // @Summary 从发布数据拉取信息到草稿 // // @Security JwtAuth // // @Description 从发布数据拉取信息到草稿 // @Tags 发布的图形数据Api // @Accept json // @Produce json // @Param id path int true "id" // @Param PublishReqDto query dto.PublishReqDto true "要保存的名称" // @Success 200 {object} nil // @Failure 401 {object} dto.ErrorDto // @Failure 500 {object} dto.ErrorDto // @Router /api/v1/publishedGi/saveAsDrafting/{id} [post] func saveAsDraftingFromPublish(c *gin.Context) { user, _ := c.Get(middleware.IdentityKey) idStr := c.Param("id") slog.Debug("用户拉取发布图形数据", "userId", user, "发布图数据id", idStr) id, err := strconv.Atoi(idStr) if err != nil { panic(sys_error.New("另存为草稿失败,传入参数格式错误", err)) } req := dto.PublishReqDto{} if err := c.ShouldBind(&req); err != nil { panic(sys_error.New("另存为草稿失败,传入参数格式错误", err)) } service.SaveAsDraftingFromPublish(int32(id), user.(*model.User), req.Name) } // 根据Code查询发布地图数据 // // @Summary 根据Code查询发布地图数据 // // @Security JwtAuth // // @Description 可以通过名称过滤 // @Tags 发布的图形数据Api // @Accept json // @Produce json // @Param publishedSingleQueryDto query dto.PublishedSingleQueryDto true "查询参数" // @Success 200 {object} dto.PublishedDto // @Failure 401 {object} dto.ErrorDto // @Failure 500 {object} dto.ErrorDto // @Router /api/v1/publishedGi/name [get] func getPublishedGiByName(c *gin.Context) { param := &dto.PublishedSingleQueryDto{} if err := c.ShouldBind(param); err != nil { panic(sys_error.New("查询失败,查询参数格式错误", err)) } slog.Debug("name查询发布的图形数据", param.Name) entity := service.GetPublishedGiByName(param) c.JSON(http.StatusOK, entity) } // 上下架发布数据 // // @Summary 上下架发布数据 // // @Security JwtAuth // // @Description 上下架发布数据 // @Tags 发布的图形数据Api // @Accept json // @Produce json // @Param PublishChangeReqDto query dto.PublishChangeReqDto true "查询参数" // @Success 200 {object} nil // @Failure 401 {object} dto.ErrorDto // @Failure 500 {object} dto.ErrorDto // @Router /api/v1/publishedGi/release [post] func releasePublishedGiById(c *gin.Context) { param := &dto.PublishChangeReqDto{} if err := c.ShouldBind(param); err != nil { panic(sys_error.New("操作失败,查询参数格式错误", err)) } service.ChangePublishStatus(param.Id, param.Release) c.JSON(http.StatusOK, true) } // 修改发布数据名称 // // @Summary 修改发布数据名称 // // @Security JwtAuth // // @Description 修改发布数据名称 // @Tags 发布的图形数据Api // @Accept json // @Produce json // @Param PublishChangeReqDto query dto.PublishChangeReqDto true "查询参数" // @Success 200 {object} nil // @Failure 401 {object} dto.ErrorDto // @Failure 500 {object} dto.ErrorDto // @Router /api/v1/publishedGi/rename [post] func renamePublishedGiById(c *gin.Context) { param := &dto.PublishChangeReqDto{} if err := c.ShouldBind(param); err != nil { panic(sys_error.New("操作失败,查询参数格式错误", err)) } service.ChangePublishCode(param.Id, param.Name) c.JSON(http.StatusOK, true) } // 查询发布历史版本信息 // // @Summary 查询发布历史版本信息 // // @Security JwtAuth // // @Description 查询发布历史版本信息 // @Tags 发布的图形数据Api // @Accept json // @Produce json // @Param PublishFallBackDto path int true "id" // @Success 200 {object} dto.PublishHistoryDto // @Failure 401 {object} dto.ErrorDto // @Failure 500 {object} dto.ErrorDto // @Router /api/v1/publishedGi/:id/history [get] func historyPublishedGiById(c *gin.Context) { idStr := c.Param("id") id, err := strconv.Atoi(idStr) if err != nil { panic(sys_error.New("查询发布历史失败,查询参数格式错误", err)) } mid := int32(id) c.JSON(http.StatusOK, service.GetPublishHistory(mid)) } // 发布地图回退到历史版本 // // @Summary 发布地图回退到历史版本 // // @Security JwtAuth // // @Description 发布地图回退到历史版本 // @Tags 发布的图形数据Api // @Accept json // @Produce json // @Param id path query dto.PublishFallBackDto true "查询参数" // @Success 200 {object} bool // @Failure 401 {object} dto.ErrorDto // @Failure 500 {object} dto.ErrorDto // @Router /api/v1/publishedGi/fallbackVersion [post] func fallbackCurrentVersion(c *gin.Context) { param := &dto.PublishFallBackDto{} if err := c.ShouldBind(param); err != nil { panic(sys_error.New("操作失败,查询参数格式错误", err)) } isChange, err := service.FallBackPublishHistory(param.MapId, param.VersionId) if err != nil { panic(sys_error.New(fmt.Sprintf("操作失败,%s", err.Error()), err)) } if isChange { memory.DeleteMapVerifyStructure(param.MapId) // 移除内存中的发布信息 } c.JSON(http.StatusOK, isChange) }