From 6c49f4b01127fe3a72acdd5b684ae9aa44162e2d Mon Sep 17 00:00:00 2001 From: "Haihui.Wang" Date: Thu, 7 May 2026 10:22:02 +0800 Subject: [PATCH] feat: Add user resources query enhancements - time range filter and total price aggregation --- .gitignore | 2 + .../accounting/mock_AccountingClient.go | 59 ++++++++++++++++++ .../store/database/mock_UserResourcesStore.go | 51 +++++++++------- .../component/mock_AccountingComponent.go | 60 +++++++++++++++++++ .../component/mock_UserComponent.go | 25 +++++--- api/handler/user.go | 11 ++-- api/handler/user_test.go | 9 +-- builder/accounting/client.go | 1 + builder/accounting/client_ce.go | 4 ++ builder/store/database/user_resources.go | 34 ++++++++--- builder/store/database/user_resources_test.go | 3 +- common/types/user_resources.go | 3 + component/accounting.go | 1 + component/accounting_ce.go | 4 ++ component/user.go | 2 +- component/user_ce.go | 4 +- 16 files changed, 222 insertions(+), 51 deletions(-) diff --git a/.gitignore b/.gitignore index 26fbfd98b..4654e4f9f 100644 --- a/.gitignore +++ b/.gitignore @@ -33,6 +33,8 @@ cmd/csghub-server/__debug_* run_dataviewer_local.sh run_notification_local.sh run_temporal_worker.sh +run_logcollector_local.sh + local.toml loki-config.yml diff --git a/_mocks/opencsg.com/csghub-server/builder/accounting/mock_AccountingClient.go b/_mocks/opencsg.com/csghub-server/builder/accounting/mock_AccountingClient.go index 0e59b6389..fd88fbeac 100644 --- a/_mocks/opencsg.com/csghub-server/builder/accounting/mock_AccountingClient.go +++ b/_mocks/opencsg.com/csghub-server/builder/accounting/mock_AccountingClient.go @@ -315,6 +315,65 @@ func (_c *MockAccountingClient_DeletePrice_Call) RunAndReturn(run func(string, i return _c } +// GetOrderDetailByID provides a mock function with given fields: currentUser, id +func (_m *MockAccountingClient) GetOrderDetailByID(currentUser string, id int64) (any, error) { + ret := _m.Called(currentUser, id) + + if len(ret) == 0 { + panic("no return value specified for GetOrderDetailByID") + } + + var r0 any + var r1 error + if rf, ok := ret.Get(0).(func(string, int64) (any, error)); ok { + return rf(currentUser, id) + } + if rf, ok := ret.Get(0).(func(string, int64) any); ok { + r0 = rf(currentUser, id) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(any) + } + } + + if rf, ok := ret.Get(1).(func(string, int64) error); ok { + r1 = rf(currentUser, id) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// MockAccountingClient_GetOrderDetailByID_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetOrderDetailByID' +type MockAccountingClient_GetOrderDetailByID_Call struct { + *mock.Call +} + +// GetOrderDetailByID is a helper method to define mock.On call +// - currentUser string +// - id int64 +func (_e *MockAccountingClient_Expecter) GetOrderDetailByID(currentUser interface{}, id interface{}) *MockAccountingClient_GetOrderDetailByID_Call { + return &MockAccountingClient_GetOrderDetailByID_Call{Call: _e.mock.On("GetOrderDetailByID", currentUser, id)} +} + +func (_c *MockAccountingClient_GetOrderDetailByID_Call) Run(run func(currentUser string, id int64)) *MockAccountingClient_GetOrderDetailByID_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(string), args[1].(int64)) + }) + return _c +} + +func (_c *MockAccountingClient_GetOrderDetailByID_Call) Return(_a0 any, _a1 error) *MockAccountingClient_GetOrderDetailByID_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *MockAccountingClient_GetOrderDetailByID_Call) RunAndReturn(run func(string, int64) (any, error)) *MockAccountingClient_GetOrderDetailByID_Call { + _c.Call.Return(run) + return _c +} + // GetPriceByID provides a mock function with given fields: currentUser, id func (_m *MockAccountingClient) GetPriceByID(currentUser string, id int64) (any, error) { ret := _m.Called(currentUser, id) diff --git a/_mocks/opencsg.com/csghub-server/builder/store/database/mock_UserResourcesStore.go b/_mocks/opencsg.com/csghub-server/builder/store/database/mock_UserResourcesStore.go index 4ccfccb8f..0d58d15ac 100644 --- a/_mocks/opencsg.com/csghub-server/builder/store/database/mock_UserResourcesStore.go +++ b/_mocks/opencsg.com/csghub-server/builder/store/database/mock_UserResourcesStore.go @@ -237,9 +237,9 @@ func (_c *MockUserResourcesStore_GetReservedUserResources_Call) RunAndReturn(run return _c } -// GetUserResourcesByUserUID provides a mock function with given fields: ctx, per, page, userId -func (_m *MockUserResourcesStore) GetUserResourcesByUserUID(ctx context.Context, per int, page int, userId string) ([]database.UserResources, int, error) { - ret := _m.Called(ctx, per, page, userId) +// GetUserResourcesByUserUID provides a mock function with given fields: ctx, per, page, userId, startTime, endTime +func (_m *MockUserResourcesStore) GetUserResourcesByUserUID(ctx context.Context, per int, page int, userId string, startTime string, endTime string) ([]database.UserResources, int, float64, error) { + ret := _m.Called(ctx, per, page, userId, startTime, endTime) if len(ret) == 0 { panic("no return value specified for GetUserResourcesByUserUID") @@ -247,31 +247,38 @@ func (_m *MockUserResourcesStore) GetUserResourcesByUserUID(ctx context.Context, var r0 []database.UserResources var r1 int - var r2 error - if rf, ok := ret.Get(0).(func(context.Context, int, int, string) ([]database.UserResources, int, error)); ok { - return rf(ctx, per, page, userId) + var r2 float64 + var r3 error + if rf, ok := ret.Get(0).(func(context.Context, int, int, string, string, string) ([]database.UserResources, int, float64, error)); ok { + return rf(ctx, per, page, userId, startTime, endTime) } - if rf, ok := ret.Get(0).(func(context.Context, int, int, string) []database.UserResources); ok { - r0 = rf(ctx, per, page, userId) + if rf, ok := ret.Get(0).(func(context.Context, int, int, string, string, string) []database.UserResources); ok { + r0 = rf(ctx, per, page, userId, startTime, endTime) } else { if ret.Get(0) != nil { r0 = ret.Get(0).([]database.UserResources) } } - if rf, ok := ret.Get(1).(func(context.Context, int, int, string) int); ok { - r1 = rf(ctx, per, page, userId) + if rf, ok := ret.Get(1).(func(context.Context, int, int, string, string, string) int); ok { + r1 = rf(ctx, per, page, userId, startTime, endTime) } else { r1 = ret.Get(1).(int) } - if rf, ok := ret.Get(2).(func(context.Context, int, int, string) error); ok { - r2 = rf(ctx, per, page, userId) + if rf, ok := ret.Get(2).(func(context.Context, int, int, string, string, string) float64); ok { + r2 = rf(ctx, per, page, userId, startTime, endTime) } else { - r2 = ret.Error(2) + r2 = ret.Get(2).(float64) } - return r0, r1, r2 + if rf, ok := ret.Get(3).(func(context.Context, int, int, string, string, string) error); ok { + r3 = rf(ctx, per, page, userId, startTime, endTime) + } else { + r3 = ret.Error(3) + } + + return r0, r1, r2, r3 } // MockUserResourcesStore_GetUserResourcesByUserUID_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetUserResourcesByUserUID' @@ -284,23 +291,25 @@ type MockUserResourcesStore_GetUserResourcesByUserUID_Call struct { // - per int // - page int // - userId string -func (_e *MockUserResourcesStore_Expecter) GetUserResourcesByUserUID(ctx interface{}, per interface{}, page interface{}, userId interface{}) *MockUserResourcesStore_GetUserResourcesByUserUID_Call { - return &MockUserResourcesStore_GetUserResourcesByUserUID_Call{Call: _e.mock.On("GetUserResourcesByUserUID", ctx, per, page, userId)} +// - startTime string +// - endTime string +func (_e *MockUserResourcesStore_Expecter) GetUserResourcesByUserUID(ctx interface{}, per interface{}, page interface{}, userId interface{}, startTime interface{}, endTime interface{}) *MockUserResourcesStore_GetUserResourcesByUserUID_Call { + return &MockUserResourcesStore_GetUserResourcesByUserUID_Call{Call: _e.mock.On("GetUserResourcesByUserUID", ctx, per, page, userId, startTime, endTime)} } -func (_c *MockUserResourcesStore_GetUserResourcesByUserUID_Call) Run(run func(ctx context.Context, per int, page int, userId string)) *MockUserResourcesStore_GetUserResourcesByUserUID_Call { +func (_c *MockUserResourcesStore_GetUserResourcesByUserUID_Call) Run(run func(ctx context.Context, per int, page int, userId string, startTime string, endTime string)) *MockUserResourcesStore_GetUserResourcesByUserUID_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(int), args[2].(int), args[3].(string)) + run(args[0].(context.Context), args[1].(int), args[2].(int), args[3].(string), args[4].(string), args[5].(string)) }) return _c } -func (_c *MockUserResourcesStore_GetUserResourcesByUserUID_Call) Return(userResources []database.UserResources, total int, err error) *MockUserResourcesStore_GetUserResourcesByUserUID_Call { - _c.Call.Return(userResources, total, err) +func (_c *MockUserResourcesStore_GetUserResourcesByUserUID_Call) Return(userResources []database.UserResources, total int, totalPrice float64, err error) *MockUserResourcesStore_GetUserResourcesByUserUID_Call { + _c.Call.Return(userResources, total, totalPrice, err) return _c } -func (_c *MockUserResourcesStore_GetUserResourcesByUserUID_Call) RunAndReturn(run func(context.Context, int, int, string) ([]database.UserResources, int, error)) *MockUserResourcesStore_GetUserResourcesByUserUID_Call { +func (_c *MockUserResourcesStore_GetUserResourcesByUserUID_Call) RunAndReturn(run func(context.Context, int, int, string, string, string) ([]database.UserResources, int, float64, error)) *MockUserResourcesStore_GetUserResourcesByUserUID_Call { _c.Call.Return(run) return _c } diff --git a/_mocks/opencsg.com/csghub-server/component/mock_AccountingComponent.go b/_mocks/opencsg.com/csghub-server/component/mock_AccountingComponent.go index b5521a649..f5eb2c0f3 100644 --- a/_mocks/opencsg.com/csghub-server/component/mock_AccountingComponent.go +++ b/_mocks/opencsg.com/csghub-server/component/mock_AccountingComponent.go @@ -319,6 +319,66 @@ func (_c *MockAccountingComponent_DeletePrice_Call) RunAndReturn(run func(string return _c } +// GetOrderDetailByID provides a mock function with given fields: ctx, currentUser, id +func (_m *MockAccountingComponent) GetOrderDetailByID(ctx context.Context, currentUser string, id int64) (*database.AccountOrderDetail, error) { + ret := _m.Called(ctx, currentUser, id) + + if len(ret) == 0 { + panic("no return value specified for GetOrderDetailByID") + } + + var r0 *database.AccountOrderDetail + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, int64) (*database.AccountOrderDetail, error)); ok { + return rf(ctx, currentUser, id) + } + if rf, ok := ret.Get(0).(func(context.Context, string, int64) *database.AccountOrderDetail); ok { + r0 = rf(ctx, currentUser, id) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*database.AccountOrderDetail) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, string, int64) error); ok { + r1 = rf(ctx, currentUser, id) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// MockAccountingComponent_GetOrderDetailByID_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetOrderDetailByID' +type MockAccountingComponent_GetOrderDetailByID_Call struct { + *mock.Call +} + +// GetOrderDetailByID is a helper method to define mock.On call +// - ctx context.Context +// - currentUser string +// - id int64 +func (_e *MockAccountingComponent_Expecter) GetOrderDetailByID(ctx interface{}, currentUser interface{}, id interface{}) *MockAccountingComponent_GetOrderDetailByID_Call { + return &MockAccountingComponent_GetOrderDetailByID_Call{Call: _e.mock.On("GetOrderDetailByID", ctx, currentUser, id)} +} + +func (_c *MockAccountingComponent_GetOrderDetailByID_Call) Run(run func(ctx context.Context, currentUser string, id int64)) *MockAccountingComponent_GetOrderDetailByID_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(string), args[2].(int64)) + }) + return _c +} + +func (_c *MockAccountingComponent_GetOrderDetailByID_Call) Return(_a0 *database.AccountOrderDetail, _a1 error) *MockAccountingComponent_GetOrderDetailByID_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *MockAccountingComponent_GetOrderDetailByID_Call) RunAndReturn(run func(context.Context, string, int64) (*database.AccountOrderDetail, error)) *MockAccountingComponent_GetOrderDetailByID_Call { + _c.Call.Return(run) + return _c +} + // GetPriceByID provides a mock function with given fields: currentUser, id func (_m *MockAccountingComponent) GetPriceByID(currentUser string, id int64) (interface{}, error) { ret := _m.Called(currentUser, id) diff --git a/_mocks/opencsg.com/csghub-server/component/mock_UserComponent.go b/_mocks/opencsg.com/csghub-server/component/mock_UserComponent.go index 170325d92..262ef83d7 100644 --- a/_mocks/opencsg.com/csghub-server/component/mock_UserComponent.go +++ b/_mocks/opencsg.com/csghub-server/component/mock_UserComponent.go @@ -537,7 +537,7 @@ func (_c *MockUserComponent_GetUserByName_Call) RunAndReturn(run func(context.Co } // GetUserResource provides a mock function with given fields: ctx, req -func (_m *MockUserComponent) GetUserResource(ctx context.Context, req types.GetUserResourceReq) ([]types.UserResourcesResp, int, error) { +func (_m *MockUserComponent) GetUserResource(ctx context.Context, req types.GetUserResourceReq) ([]types.UserResourcesResp, int, float64, error) { ret := _m.Called(ctx, req) if len(ret) == 0 { @@ -546,8 +546,9 @@ func (_m *MockUserComponent) GetUserResource(ctx context.Context, req types.GetU var r0 []types.UserResourcesResp var r1 int - var r2 error - if rf, ok := ret.Get(0).(func(context.Context, types.GetUserResourceReq) ([]types.UserResourcesResp, int, error)); ok { + var r2 float64 + var r3 error + if rf, ok := ret.Get(0).(func(context.Context, types.GetUserResourceReq) ([]types.UserResourcesResp, int, float64, error)); ok { return rf(ctx, req) } if rf, ok := ret.Get(0).(func(context.Context, types.GetUserResourceReq) []types.UserResourcesResp); ok { @@ -564,13 +565,19 @@ func (_m *MockUserComponent) GetUserResource(ctx context.Context, req types.GetU r1 = ret.Get(1).(int) } - if rf, ok := ret.Get(2).(func(context.Context, types.GetUserResourceReq) error); ok { + if rf, ok := ret.Get(2).(func(context.Context, types.GetUserResourceReq) float64); ok { r2 = rf(ctx, req) } else { - r2 = ret.Error(2) + r2 = ret.Get(2).(float64) } - return r0, r1, r2 + if rf, ok := ret.Get(3).(func(context.Context, types.GetUserResourceReq) error); ok { + r3 = rf(ctx, req) + } else { + r3 = ret.Error(3) + } + + return r0, r1, r2, r3 } // MockUserComponent_GetUserResource_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetUserResource' @@ -592,12 +599,12 @@ func (_c *MockUserComponent_GetUserResource_Call) Run(run func(ctx context.Conte return _c } -func (_c *MockUserComponent_GetUserResource_Call) Return(_a0 []types.UserResourcesResp, _a1 int, _a2 error) *MockUserComponent_GetUserResource_Call { - _c.Call.Return(_a0, _a1, _a2) +func (_c *MockUserComponent_GetUserResource_Call) Return(_a0 []types.UserResourcesResp, _a1 int, _a2 float64, _a3 error) *MockUserComponent_GetUserResource_Call { + _c.Call.Return(_a0, _a1, _a2, _a3) return _c } -func (_c *MockUserComponent_GetUserResource_Call) RunAndReturn(run func(context.Context, types.GetUserResourceReq) ([]types.UserResourcesResp, int, error)) *MockUserComponent_GetUserResource_Call { +func (_c *MockUserComponent_GetUserResource_Call) RunAndReturn(run func(context.Context, types.GetUserResourceReq) ([]types.UserResourcesResp, int, float64, error)) *MockUserComponent_GetUserResource_Call { _c.Call.Return(run) return _c } diff --git a/api/handler/user.go b/api/handler/user.go index daf70e87e..44cf7c648 100644 --- a/api/handler/user.go +++ b/api/handler/user.go @@ -825,16 +825,19 @@ func (h *UserHandler) GetUserResource(ctx *gin.Context) { req.CurrentUser = currentUser req.Page = page req.PageSize = per - ds, total, err := h.user.GetUserResource(ctx.Request.Context(), req) + req.StartTime = ctx.Query("start_time") + req.EndTime = ctx.Query("end_time") + ds, total, totalPrice, err := h.user.GetUserResource(ctx.Request.Context(), req) if err != nil { slog.ErrorContext(ctx.Request.Context(), "failed to get user's resource", slog.Any("error", err), slog.Any("username", username)) httpbase.ServerError(ctx, err) return } respData := gin.H{ - "message": "OK", - "data": ds, - "total": total, + "message": "OK", + "data": ds, + "total": total, + "total_price": totalPrice, } ctx.JSON(http.StatusOK, respData) } diff --git a/api/handler/user_test.go b/api/handler/user_test.go index f48b6c21a..32aaf293c 100644 --- a/api/handler/user_test.go +++ b/api/handler/user_test.go @@ -455,13 +455,14 @@ func TestUserHandler_GetUserResource(t *testing.T) { Page: 1, PageSize: 10, }, - }).Return([]types.UserResourcesResp{{ID: 123}}, 100, nil) + }).Return([]types.UserResourcesResp{{ID: 123}}, 100, 50.0, nil) tester.WithParam("username", "u").AddPagination(1, 10).Execute() tester.ResponseEqSimple(t, 200, gin.H{ - "message": "OK", - "data": []types.UserResourcesResp{{ID: 123}}, - "total": 100, + "message": "OK", + "data": []types.UserResourcesResp{{ID: 123}}, + "total": 100, + "total_price": 50.0, }) } diff --git a/builder/accounting/client.go b/builder/accounting/client.go index 26b6aa288..205a8e1ed 100644 --- a/builder/accounting/client.go +++ b/builder/accounting/client.go @@ -36,6 +36,7 @@ type AccountingClient interface { ListRecharges(req types.RechargesIndexReq) (any, error) StatementsIndex(req types.ActStatementsReq) (any, error) ListPresents(req types.PresentsIndexReq) (any, error) + GetOrderDetailByID(currentUser string, id int64) (any, error) } type accountingClientImpl struct { remote *url.URL diff --git a/builder/accounting/client_ce.go b/builder/accounting/client_ce.go index 820d2c7f4..cc83122c0 100644 --- a/builder/accounting/client_ce.go +++ b/builder/accounting/client_ce.go @@ -93,3 +93,7 @@ func (ac *accountingClientImpl) StatementsIndex(req types.ActStatementsReq) (any func (ac *accountingClientImpl) ListPresents(req types.PresentsIndexReq) (any, error) { return nil, nil } + +func (ac *accountingClientImpl) GetOrderDetailByID(currentUser string, id int64) (any, error) { + return nil, nil +} diff --git a/builder/store/database/user_resources.go b/builder/store/database/user_resources.go index 5c1e606b2..ebe98cc19 100644 --- a/builder/store/database/user_resources.go +++ b/builder/store/database/user_resources.go @@ -3,8 +3,9 @@ package database import ( "context" "fmt" - "opencsg.com/csghub-server/common/errorx" "time" + + "opencsg.com/csghub-server/common/errorx" ) type userResourcesStoreImpl struct { @@ -15,7 +16,7 @@ type UserResourcesStore interface { // add user resources AddUserResources(ctx context.Context, userResources *UserResources) error // get user resources by user uid - GetUserResourcesByUserUID(ctx context.Context, per, page int, userId string) (userResources []UserResources, total int, err error) + GetUserResourcesByUserUID(ctx context.Context, per, page int, userId string, startTime, endTime string) (userResources []UserResources, total int, totalPrice float64, err error) // get need reserved user resources which is not deployed and not expired GetReservedUserResources(ctx context.Context, userId string, clusterId string) ([]UserResources, error) // update deploy id @@ -65,26 +66,41 @@ func (s *userResourcesStoreImpl) AddUserResources(ctx context.Context, userResou } // get user resources by user uid -func (s *userResourcesStoreImpl) GetUserResourcesByUserUID(ctx context.Context, per, page int, userId string) (userResources []UserResources, total int, err error) { +func (s *userResourcesStoreImpl) GetUserResourcesByUserUID(ctx context.Context, per, page int, userId string, startTime, endTime string) (userResources []UserResources, total int, totalPrice float64, err error) { - query := s.db.Operator.Core. + baseQuery := s.db.Operator.Core. NewSelect(). Model(&userResources). - Relation("SpaceResource"). - Relation("Deploy"). Where("user_resources.user_uid = ?", userId) - query = query.Order("user_resources.created_at DESC"). + if startTime != "" { + baseQuery = baseQuery.Where("user_resources.created_at >= ?", startTime) + } + if endTime != "" { + baseQuery = baseQuery.Where("user_resources.created_at <= ?", endTime) + } + + // Calculate total price before pagination (separate query without relations) + err = baseQuery.Clone().ColumnExpr("COALESCE(SUM(price), 0)").Scan(ctx, &totalPrice) + if err != nil { + return userResources, 0, 0, errorx.HandleDBError(err, nil) + } + + // Get paginated data with relations + query := baseQuery. + Relation("SpaceResource"). + Relation("Deploy"). + Order("user_resources.created_at DESC"). Limit(per). Offset((page - 1) * per) err = query.Scan(ctx) if err != nil { - return userResources, 0, errorx.HandleDBError(err, nil) + return userResources, 0, 0, errorx.HandleDBError(err, nil) } total, err = query.Count(ctx) if err != nil { - return userResources, total, errorx.HandleDBError(err, nil) + return userResources, total, totalPrice, errorx.HandleDBError(err, nil) } return } diff --git a/builder/store/database/user_resources_test.go b/builder/store/database/user_resources_test.go index 400565d89..322bc7336 100644 --- a/builder/store/database/user_resources_test.go +++ b/builder/store/database/user_resources_test.go @@ -30,10 +30,11 @@ func TestUserResourcesStore_CRUD(t *testing.T) { require.Nil(t, err) require.Equal(t, "o1", ur.OrderId) - urs, total, err := store.GetUserResourcesByUserUID(ctx, 10, 1, "u1") + urs, total, totalPrice, err := store.GetUserResourcesByUserUID(ctx, 10, 1, "u1", "", "") require.Nil(t, err) require.Equal(t, 1, total) require.Equal(t, "o1", urs[0].OrderId) + require.Equal(t, 0.0, totalPrice) ur, err = store.FindUserResourcesByOrderDetailId(ctx, "u1", 123) require.Nil(t, err) diff --git a/common/types/user_resources.go b/common/types/user_resources.go index c2b2f428f..d9b726134 100644 --- a/common/types/user_resources.go +++ b/common/types/user_resources.go @@ -11,6 +11,8 @@ type CreateUserResourceReq struct { type GetUserResourceReq struct { CurrentUser string `json:"current_user"` UserUID string `json:"-"` + StartTime string `json:"-"` + EndTime string `json:"-"` PageOpts } @@ -31,4 +33,5 @@ type UserResourcesResp struct { DeployID int64 `json:"deploy_id"` ResourceType string `json:"resource_type"` DeployType int `json:"deploy_type"` + OrderCount int `json:"order_count"` } diff --git a/component/accounting.go b/component/accounting.go index 2f753931c..8509d4006 100644 --- a/component/accounting.go +++ b/component/accounting.go @@ -50,6 +50,7 @@ type AccountingComponent interface { StatementsIndex(ctx context.Context, req types.ActStatementsReq) ([]types.AcctStatementsRes, int, error) ListPresents(ctx context.Context, req types.PresentsIndexReq) ([]*types.PresentIndexResp, int, error) WeeklyRecharges(ctx context.Context) error + GetOrderDetailByID(ctx context.Context, currentUser string, id int64) (*database.AccountOrderDetail, error) } func NewAccountingComponent(config *config.Config) (AccountingComponent, error) { diff --git a/component/accounting_ce.go b/component/accounting_ce.go index 849ce28ec..50f23b0ca 100644 --- a/component/accounting_ce.go +++ b/component/accounting_ce.go @@ -81,6 +81,10 @@ func (ac *accountingComponentImpl) CreateOrder(currentUser string, req types.Acc return nil, nil } +func (ac *accountingComponentImpl) GetOrderDetailByID(ctx context.Context, currentUser string, id int64) (*database.AccountOrderDetail, error) { + return nil, nil +} + func (ac *accountingComponentImpl) ListRecharge(ctx context.Context, req types.AcctRechargeListReq) (interface{}, error) { return nil, nil } diff --git a/component/user.go b/component/user.go index ebf08ca7e..6fcc8c98d 100644 --- a/component/user.go +++ b/component/user.go @@ -42,7 +42,7 @@ type UserComponent interface { CreateUserResource(ctx context.Context, req types.CreateUserResourceReq) error DeleteUserResource(ctx context.Context, username string, orderDetailId int64) error // GetUserResource - GetUserResource(ctx context.Context, req types.GetUserResourceReq) ([]types.UserResourcesResp, int, error) + GetUserResource(ctx context.Context, req types.GetUserResourceReq) ([]types.UserResourcesResp, int, float64, error) GetUserByName(ctx context.Context, userName string) (*database.User, error) Prompts(ctx context.Context, req *types.UserPromptsReq) ([]types.PromptRes, int, error) Evaluations(ctx context.Context, req *types.UserEvaluationReq) ([]types.ArgoWorkFlowRes, int, error) diff --git a/component/user_ce.go b/component/user_ce.go index f27733001..3fe363386 100644 --- a/component/user_ce.go +++ b/component/user_ce.go @@ -113,8 +113,8 @@ func (c *userComponentImpl) DeleteUserResource(ctx context.Context, username str } // GetUserResource -func (c *userComponentImpl) GetUserResource(ctx context.Context, req types.GetUserResourceReq) ([]types.UserResourcesResp, int, error) { - return nil, 0, nil +func (c *userComponentImpl) GetUserResource(ctx context.Context, req types.GetUserResourceReq) ([]types.UserResourcesResp, int, float64, error) { + return nil, 0, 0, nil } func (c *userComponentImpl) ListNotebooks(ctx context.Context, req *types.DeployReq) ([]types.NotebookRes, int, error) {