已完成用户APP首期功能开发
交付用户端首期页面、配套接口、后台资源及测试文档。用户APP构建、静态分析和三个管理后台构建通过;完整测试仍有2项失败,后端模型注释检查未通过,详见交付记录。
This commit is contained in:
@@ -26,34 +26,85 @@ func registerUserClient(serviceKey string, engine *gin.Engine) {
|
||||
anonymous.GET("/public/gas-stations", userlogic.PublicGasStations)
|
||||
anonymous.GET("/public/delivery-points", userlogic.PublicDeliveryPoints)
|
||||
anonymous.GET("/public/contents", userlogic.PublicContents)
|
||||
anonymous.GET("/public/contents/:identity", userlogic.PublicSafetyContent)
|
||||
anonymous.GET("/public/products", userlogic.PublicProducts)
|
||||
anonymous.GET("/public/products/:identity", userlogic.PublicProduct)
|
||||
|
||||
protected := engine.Group(basePath)
|
||||
protected.Use(sdkmiddleware.JwtAuth(true), common.RequireClient("user_app"))
|
||||
protected.GET("/auth/profile", userlogic.Profile)
|
||||
protected.GET("/owned-products", userlogic.ListOwnedProducts)
|
||||
protected.GET("/devices", userlogic.ListDevices)
|
||||
protected.PUT("/devices/:identity/group", userlogic.AssignDeviceGroup)
|
||||
protected.GET("/device-groups", userlogic.ListDeviceGroups)
|
||||
protected.GET("/usage-statistics", userlogic.GetUsageStatistics)
|
||||
protected.GET("/messages", userlogic.ListMessages)
|
||||
protected.PUT("/messages/read", userlogic.MarkMessagesRead)
|
||||
protected.POST("/device-groups", userlogic.SaveDeviceGroup)
|
||||
protected.PUT("/device-groups/:identity", userlogic.SaveDeviceGroup)
|
||||
protected.DELETE("/device-groups/:identity", userlogic.DeleteDeviceGroup)
|
||||
protected.GET("/emergency-contacts", userlogic.ListEmergencyContacts)
|
||||
protected.POST("/emergency-contacts", userlogic.SaveEmergencyContact)
|
||||
protected.PUT("/emergency-contacts/:identity", userlogic.SaveEmergencyContact)
|
||||
protected.DELETE("/emergency-contacts/:identity", userlogic.DeleteEmergencyContact)
|
||||
protected.GET("/family", userlogic.FamilyDashboard)
|
||||
protected.POST("/family-members", userlogic.InviteFamilyMember)
|
||||
protected.PUT("/family-members/:identity/device-permissions", userlogic.UpdateFamilyPermissions)
|
||||
protected.DELETE("/family-members/:identity", userlogic.RevokeFamilyMember)
|
||||
protected.GET("/family-invitations", userlogic.ListFamilyInvitations)
|
||||
protected.POST("/family-invitations/:identity/respond", userlogic.RespondFamilyInvitation)
|
||||
protected.POST("/ticket-photos", userlogic.UploadTicketPhoto)
|
||||
protected.GET("/ticket-photos/:name", userlogic.UploadedTicketPhoto)
|
||||
protected.GET("/tickets/:identity/photos/:photoIdentity", userlogic.TicketPhoto)
|
||||
protected.GET("/auth/avatar", userlogic.Avatar)
|
||||
protected.PUT("/auth/profile", userlogic.UpdateProfile)
|
||||
protected.PUT("/auth/password", userlogic.ChangePassword)
|
||||
protected.GET("/addresses", userlogic.ListAddresses)
|
||||
protected.POST("/addresses", userlogic.SaveAddress)
|
||||
protected.PUT("/addresses/:identity", userlogic.UpdateAddress)
|
||||
protected.DELETE("/addresses/:identity", userlogic.DeleteAddress)
|
||||
protected.POST("/addresses/:identity/default", userlogic.SetDefaultAddress)
|
||||
protected.POST("/contents/read-confirmations", userlogic.ConfirmContentRead)
|
||||
protected.GET("/service-relation", userlogic.ServiceRelation)
|
||||
protected.GET("/gas/contracts", userlogic.ListGasContracts)
|
||||
protected.GET("/gas/orders", userlogic.ListGasOrders)
|
||||
protected.GET("/gas/order-options", userlogic.GetGasOrderOptions)
|
||||
protected.POST("/gas/orders", userlogic.CreateGasOrder)
|
||||
protected.GET("/gas/orders/:identity", userlogic.GetGasOrder)
|
||||
protected.POST("/gas/orders/:identity/confirm-receipt", userlogic.ConfirmGasReceipt)
|
||||
protected.GET("/gas/contracts/:identity", userlogic.GetGasContract)
|
||||
protected.GET("/gas/contracts/:identity/attachment", userlogic.DownloadGasContractAttachment)
|
||||
protected.GET("/gas/contracts/:identity/history", userlogic.GetGasContractHistory)
|
||||
protected.GET("/gas/contracts/:identity/requests", userlogic.ListGasContractRequests)
|
||||
protected.POST("/gas/contracts/:identity/requests", userlogic.CreateGasContractRequest)
|
||||
protected.POST("/gas/orders/:identity/cancel", userlogic.CancelGasOrder)
|
||||
protected.POST("/gas/orders/:identity/pay", userlogic.PayGasOrder)
|
||||
protected.GET("/gas/orders/:identity/delivery", userlogic.GetGasOrderDelivery)
|
||||
protected.GET("/gas/orders/:identity/delivery/track", userlogic.GetGasOrderDeliveryTrack)
|
||||
protected.POST("/gas/orders/:identity/refunds", userlogic.CreateRefund("gasorder"))
|
||||
protected.GET("/tickets", userlogic.ListTickets)
|
||||
protected.POST("/tickets", userlogic.CreateTicket)
|
||||
protected.POST("/tickets/:identity/confirm", userlogic.ConfirmTicket)
|
||||
protected.POST("/tickets/:identity/cancel", userlogic.CancelTicket)
|
||||
protected.GET("/shop/orders", userlogic.ListShopOrders)
|
||||
protected.GET("/shop/orders/:identity", userlogic.GetShopOrder)
|
||||
protected.GET("/shop/cart", userlogic.ListCart)
|
||||
protected.GET("/shop/favorites", userlogic.ListFavorites)
|
||||
protected.GET("/shop/recommendations", userlogic.Recommendations)
|
||||
protected.GET("/shop/favorites/items/:identity", userlogic.FavoriteState)
|
||||
protected.PUT("/shop/favorites/items/:identity", userlogic.SetFavorite)
|
||||
protected.GET("/shop/cart/items/:identity", userlogic.GetCartItem)
|
||||
protected.PUT("/shop/cart/items/:identity", userlogic.SetCartItem)
|
||||
protected.POST("/shop/orders", userlogic.CreateShopOrder)
|
||||
protected.POST("/shop/orders/:identity/cancel", userlogic.CancelShopOrder)
|
||||
protected.POST("/shop/orders/:identity/pay", userlogic.PayShopOrder)
|
||||
protected.POST("/shop/orders/:identity/refunds", userlogic.CreateRefund("ec_order"))
|
||||
protected.POST("/shop/orders/:identity/confirm-receipt", userlogic.ConfirmShopReceipt)
|
||||
protected.GET("/refunds", userlogic.ListRefunds)
|
||||
protected.GET("/deposits", userlogic.ListDeposits)
|
||||
protected.POST("/deposit-returns", userlogic.CreateDepositReturn)
|
||||
protected.GET("/deposit-returns/:identity", userlogic.GetDepositReturn)
|
||||
protected.POST("/deposit-returns/:identity/cancel", userlogic.CancelDepositReturn)
|
||||
registerClientWalletRoutes(protected, "user_app")
|
||||
}
|
||||
|
||||
@@ -91,10 +142,16 @@ func registerClientWalletRoutes(group *gin.RouterGroup, client string) {
|
||||
group.GET("/wallet", common.GetWallet(client))
|
||||
group.PUT("/wallet/payment-password", common.SetPaymentPassword(client))
|
||||
group.GET("/wallet/records", common.ListWalletRecords(client))
|
||||
group.GET("/wallet/bills", common.ListWalletBills(client))
|
||||
group.POST("/wallet/recharges", common.CreateRecharge(client))
|
||||
group.GET("/wallet/recharge-options", common.GetRechargeOptions(client))
|
||||
group.GET("/wallet/recharges", common.ListRecharges(client))
|
||||
group.GET("/wallet/recharges/:identity", common.GetRecharge(client))
|
||||
group.GET("/wallet/recharge-requests/:request", common.GetRecharge(client))
|
||||
group.POST("/wallet/recharges/:identity/mock-confirm", common.ConfirmMockRecharge(client))
|
||||
group.GET("/wallet/banks", common.ListBanks(client))
|
||||
group.POST("/wallet/banks", common.BindBank(client))
|
||||
group.POST("/wallet/banks/:identity/default", common.SetDefaultBank(client))
|
||||
group.DELETE("/wallet/banks/:identity", common.UnbindBank(client))
|
||||
group.GET("/wallet/withdrawals", common.ListWithdrawals(client))
|
||||
group.POST("/wallet/withdrawals", common.CreateWithdrawal(client))
|
||||
|
||||
@@ -12,10 +12,50 @@ func TestRegisterClientRoutes(t *testing.T) {
|
||||
RegisterClient("heqi", engine)
|
||||
|
||||
expected := map[string]bool{
|
||||
"GET /heqi/client/v1/user/devices": false,
|
||||
"PUT /heqi/client/v1/user/devices/:identity/group": false,
|
||||
"GET /heqi/client/v1/user/device-groups": false,
|
||||
"POST /heqi/client/v1/user/device-groups": false,
|
||||
"PUT /heqi/client/v1/user/device-groups/:identity": false,
|
||||
"DELETE /heqi/client/v1/user/device-groups/:identity": false,
|
||||
"GET /heqi/client/v1/user/gas/orders/:identity": false,
|
||||
"GET /heqi/client/v1/user/gas/order-options": false,
|
||||
"POST /heqi/client/v1/user/gas/orders": false,
|
||||
"POST /heqi/client/v1/user/gas/orders/:identity/pay": false,
|
||||
"POST /heqi/client/v1/user/gas/orders/:identity/confirm-receipt": false,
|
||||
"GET /heqi/client/v1/user/gas/contracts/:identity": false,
|
||||
"GET /heqi/client/v1/user/gas/contracts/:identity/attachment": false,
|
||||
"GET /heqi/client/v1/user/gas/contracts/:identity/history": false,
|
||||
"GET /heqi/client/v1/user/gas/contracts/:identity/requests": false,
|
||||
"POST /heqi/client/v1/user/gas/contracts/:identity/requests": false,
|
||||
"GET /heqi/client/v1/user/shop/orders/:identity": false,
|
||||
"GET /heqi/client/v1/user/shop/recommendations": false,
|
||||
"GET /heqi/client/v1/user/shop/favorites": false,
|
||||
"GET /heqi/client/v1/user/shop/favorites/items/:identity": false,
|
||||
"PUT /heqi/client/v1/user/shop/favorites/items/:identity": false,
|
||||
"GET /heqi/client/v1/user/shop/cart": false,
|
||||
"GET /heqi/client/v1/user/shop/cart/items/:identity": false,
|
||||
"PUT /heqi/client/v1/user/shop/cart/items/:identity": false,
|
||||
"POST /heqi/client/v1/user/ticket-photos": false,
|
||||
"GET /heqi/client/v1/user/ticket-photos/:name": false,
|
||||
"GET /heqi/client/v1/user/tickets/:identity/photos/:photoIdentity": false,
|
||||
"PUT /heqi/client/v1/user/addresses/:identity": false,
|
||||
"DELETE /heqi/client/v1/user/addresses/:identity": false,
|
||||
"POST /heqi/client/v1/user/addresses/:identity/default": false,
|
||||
"POST /heqi/client/v1/user/auth/register": false,
|
||||
"POST /heqi/client/v1/user/auth/login": false,
|
||||
"GET /heqi/client/v1/user/auth/avatar": false,
|
||||
"POST /heqi/client/v1/user/wallet/recharges": false,
|
||||
"GET /heqi/client/v1/user/wallet/banks": false,
|
||||
"POST /heqi/client/v1/user/wallet/banks": false,
|
||||
"POST /heqi/client/v1/user/wallet/banks/:identity/default": false,
|
||||
"DELETE /heqi/client/v1/user/wallet/banks/:identity": false,
|
||||
"GET /heqi/client/v1/user/wallet/withdrawals": false,
|
||||
"POST /heqi/client/v1/user/wallet/withdrawals": false,
|
||||
"GET /heqi/client/v1/user/deposits": false,
|
||||
"POST /heqi/client/v1/user/deposit-returns": false,
|
||||
"GET /heqi/client/v1/user/deposit-returns/:identity": false,
|
||||
"POST /heqi/client/v1/user/deposit-returns/:identity/cancel": false,
|
||||
"POST /heqi/client/v1/user/shop/orders/:identity/pay": false,
|
||||
"POST /heqi/client/v1/staff/auth/login": false,
|
||||
"GET /heqi/client/v1/staff/preflight": false,
|
||||
|
||||
@@ -117,6 +117,7 @@ func registerGasBusinessRoutes(group *gin.RouterGroup) {
|
||||
ticket.GET("", gaslogic.ListTicket)
|
||||
ticket.POST("", gaslogic.CreateTicket)
|
||||
ticket.GET("/:identity", gaslogic.GetTicket)
|
||||
ticket.POST("/:identity/resolve-contract-request", gaslogic.ResolveContractRequest)
|
||||
ticket.PUT("/:identity", gaslogic.UpdateTicket)
|
||||
ticket.PATCH("/:identity/status", gaslogic.UpdateTicketStatus)
|
||||
ticket.DELETE("/:identity", gaslogic.ArchiveTicket)
|
||||
|
||||
@@ -142,6 +142,14 @@ func registerProductRoute(group *gin.RouterGroup) {
|
||||
info.PATCH("/:identity/status", product.UpdateProductInfoRecordStatus)
|
||||
info.PATCH("/:identity/lifecycle", product.UpdateProductInfoLifecycle)
|
||||
|
||||
registerRestrictedNoDeleteResource(
|
||||
group,
|
||||
"/dev_usage_stat",
|
||||
&models.DevUsageStat{},
|
||||
[]string{"stat_date", "usage_kg", "breakfast_kg", "lunch_kg", "dinner_kg", "source", "calc_version", "calculated_at"},
|
||||
requiredRelation("product_info_identity", "product_info_id", &models.ProductInfo{}),
|
||||
)
|
||||
|
||||
repairList, repairCreate, repairGet, repairUpdate := product.ProductRepairHandlers(
|
||||
requiredRelation("product_info_identity", "product_info_id", &models.ProductInfo{}),
|
||||
)
|
||||
@@ -190,6 +198,13 @@ func registerCommerceRoute(group *gin.RouterGroup) {
|
||||
registerReadOnlyHandlers(group, "/ec_order", func(ctx *gin.Context) { common.ListResource(ctx, &models.EcOrder{}) }, ec.GetEcOrder)
|
||||
registerReadOnlyResource(group, "/ec_order_item", &models.EcOrderItem{})
|
||||
registerReadOnlyResource(group, "/ec_review", &models.EcReview{})
|
||||
registerRestrictedWritableResource(group, "/deposit_policy", &models.DepositPolicy{}, []string{"name", "amount", "rule_text"}, requiredRelation("product_type_identity", "product_type_id", &models.ProductType{}))
|
||||
registerReadOnlyResource(group, "/deposit_record", &models.DepositRecord{})
|
||||
registerReadOnlyResource(group, "/deposit_return_request", &models.DepositReturnRequest{})
|
||||
returns := group.Group("/deposit_return_request")
|
||||
returns.POST("/:identity/confirm-pickup", platformbase.ConfirmDepositPickup)
|
||||
returns.POST("/:identity/inspect", platformbase.InspectDepositReturn)
|
||||
returns.POST("/:identity/complete-refund", platformbase.CompleteDepositRefund)
|
||||
}
|
||||
|
||||
func registerStaffRoute(group *gin.RouterGroup) {
|
||||
@@ -249,7 +264,8 @@ func registerFinanceRoute(group *gin.RouterGroup) {
|
||||
|
||||
func registerContentRoute(group *gin.RouterGroup) {
|
||||
registerRestrictedWritableResource(group, "/cms_content", &models.CmsContent{}, []string{"content_type", "title", "body", "version_no", "publish_status"})
|
||||
registerRestrictedWritableResource(group, "/cs_ticket", &models.CsTicket{}, []string{"ticket_no", "category", "priority"}, requiredRelation("user_account_identity", "user_account_id", &models.UserAccount{}))
|
||||
ticketList, ticketCreate, ticketGet, ticketUpdate := common.ResourceHandlers(&models.CsTicket{}, []string{"ticket_no", "category", "priority"}, []string{"ticket_no", "category", "priority"}, requiredRelation("user_account_identity", "user_account_id", &models.UserAccount{}))
|
||||
registerWritableResource(group, "/cs_ticket", ticketList, ticketCreate, ticketGet, platformbase.GuardContractTicketUpdate(ticketUpdate), &models.CsTicket{})
|
||||
}
|
||||
|
||||
func registerWritableResource(group *gin.RouterGroup, path string, list, create, get, update gin.HandlerFunc, model any) {
|
||||
|
||||
@@ -142,6 +142,15 @@ func TestPlatformProductCommerceAndDeliveryRoutesFollowTheirContracts(t *testing
|
||||
assertNoRouteMethods(t, routes, path, http.MethodPost, http.MethodPut, http.MethodPatch, http.MethodDelete)
|
||||
assertNoRouteMethods(t, routes, path+"/:identity", http.MethodPost, http.MethodPut, http.MethodPatch, http.MethodDelete)
|
||||
}
|
||||
for _, resource := range []string{"/deposit_record", "/deposit_return_request"} {
|
||||
path := "/heqi/platform/v1" + resource
|
||||
assertRouteMethods(t, routes, path, http.MethodGet)
|
||||
assertRouteMethods(t, routes, path+"/:identity", http.MethodGet)
|
||||
}
|
||||
assertRouteMethods(t, routes, "/heqi/platform/v1/deposit_policy", http.MethodGet, http.MethodPost)
|
||||
assertRouteMethods(t, routes, "/heqi/platform/v1/deposit_return_request/:identity/confirm-pickup", http.MethodPost)
|
||||
assertRouteMethods(t, routes, "/heqi/platform/v1/deposit_return_request/:identity/inspect", http.MethodPost)
|
||||
assertRouteMethods(t, routes, "/heqi/platform/v1/deposit_return_request/:identity/complete-refund", http.MethodPost)
|
||||
|
||||
for _, resource := range []string{"/gasorder_item", "/gasorder_assign", "/gasorder_status", "/gasorder_track", "/gasorder_track_point", "/gasorder_confirm", "/gasorder_payment", "/gasorder_contract_revision"} {
|
||||
path := "/heqi/platform/v1" + resource
|
||||
|
||||
@@ -12,4 +12,6 @@ func registerUploadRoute(serviceKey string, engine *gin.Engine) {
|
||||
authorized.Use(sdkmiddleware.JwtAuth(true))
|
||||
authorized.POST("/file", upload.UploadFile)
|
||||
authorized.POST("/avatar", upload.UploadAvatar)
|
||||
authorized.POST("/product-image", upload.UploadProductImage)
|
||||
engine.GET("/uploads/product-images/:name", upload.ServeProductImage)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user