userresources.go 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. // Copyright 2019 Yunion
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package db
  15. import (
  16. "context"
  17. "yunion.io/x/jsonutils"
  18. "yunion.io/x/log"
  19. "yunion.io/x/pkg/errors"
  20. "yunion.io/x/pkg/util/rbacscope"
  21. "yunion.io/x/pkg/util/reflectutils"
  22. "yunion.io/x/sqlchemy"
  23. "yunion.io/x/onecloud/pkg/apis"
  24. "yunion.io/x/onecloud/pkg/httperrors"
  25. "yunion.io/x/onecloud/pkg/mcclient"
  26. "yunion.io/x/onecloud/pkg/util/stringutils2"
  27. )
  28. type SUserResourceBaseManager struct {
  29. SStandaloneResourceBaseManager
  30. }
  31. func NewUserResourceBaseManager(dt interface{}, tableName string, keyword string, keywordPlural string) SUserResourceBaseManager {
  32. return SUserResourceBaseManager{
  33. SStandaloneResourceBaseManager: NewStandaloneResourceBaseManager(dt,
  34. tableName, keyword, keywordPlural),
  35. }
  36. }
  37. type SUserResourceBase struct {
  38. SStandaloneResourceBase
  39. // 本地用户Id
  40. OwnerId string `width:"128" charset:"ascii" index:"true" list:"user" nullable:"false" create:"required"`
  41. }
  42. func (manager *SUserResourceBaseManager) ListItemFilter(
  43. ctx context.Context,
  44. q *sqlchemy.SQuery,
  45. userCred mcclient.TokenCredential,
  46. query apis.UserResourceListInput,
  47. ) (*sqlchemy.SQuery, error) {
  48. q, err := manager.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.StandaloneResourceListInput)
  49. if err != nil {
  50. return nil, err
  51. }
  52. if ((query.Admin != nil && *query.Admin) || query.Scope == string(rbacscope.ScopeSystem)) && IsAdminAllowList(userCred, manager).Result.IsAllow() {
  53. user := query.UserId
  54. if len(user) > 0 {
  55. uc, _ := UserCacheManager.FetchUserByIdOrName(ctx, user)
  56. if uc == nil {
  57. return nil, httperrors.NewUserNotFoundError("user %s not found", user)
  58. }
  59. q = q.Equals("owner_id", uc.Id)
  60. }
  61. } else {
  62. q = q.Equals("owner_id", userCred.GetUserId())
  63. }
  64. return q, nil
  65. }
  66. func (manager *SUserResourceBaseManager) OrderByExtraFields(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query apis.UserResourceListInput) (*sqlchemy.SQuery, error) {
  67. q, err := manager.SStandaloneResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.StandaloneResourceListInput)
  68. if err != nil {
  69. return nil, err
  70. }
  71. return q, nil
  72. }
  73. func (manager *SUserResourceBaseManager) QueryDistinctExtraField(q *sqlchemy.SQuery, field string) (*sqlchemy.SQuery, error) {
  74. q, err := manager.SStandaloneResourceBaseManager.QueryDistinctExtraField(q, field)
  75. if err == nil {
  76. return q, nil
  77. }
  78. return q, httperrors.ErrNotFound
  79. }
  80. func (manager *SUserResourceBaseManager) FetchCustomizeColumns(
  81. ctx context.Context,
  82. userCred mcclient.TokenCredential,
  83. query jsonutils.JSONObject,
  84. objs []interface{},
  85. fields stringutils2.SSortedStrings,
  86. isList bool,
  87. ) []apis.UserResourceDetails {
  88. rows := make([]apis.UserResourceDetails, len(objs))
  89. stdRows := manager.SStandaloneResourceBaseManager.FetchCustomizeColumns(ctx, userCred, query, objs, fields, isList)
  90. userIds := make([]string, len(objs))
  91. for i := range rows {
  92. rows[i] = apis.UserResourceDetails{
  93. StandaloneResourceDetails: stdRows[i],
  94. }
  95. var base *SUserResourceBase
  96. reflectutils.FindAnonymouStructPointer(objs[i], &base)
  97. if base != nil && len(base.OwnerId) > 0 {
  98. userIds[i] = base.OwnerId
  99. }
  100. }
  101. userMaps, err := FetchIdNameMap2(UserCacheManager, userIds)
  102. if err != nil {
  103. log.Errorf("FetchIdNameMap2 fail: %v", err)
  104. return rows
  105. }
  106. for i := range rows {
  107. rows[i].OwnerName, _ = userMaps[userIds[i]]
  108. }
  109. return rows
  110. }
  111. func (manager *SUserResourceBaseManager) FilterByOwner(ctx context.Context, q *sqlchemy.SQuery, man FilterByOwnerProvider, userCred mcclient.TokenCredential, owner mcclient.IIdentityProvider, scope rbacscope.TRbacScope) *sqlchemy.SQuery {
  112. if owner != nil {
  113. if scope == rbacscope.ScopeUser {
  114. if len(owner.GetUserId()) > 0 {
  115. q = q.Equals("owner_id", owner.GetUserId())
  116. }
  117. }
  118. }
  119. return q
  120. }
  121. func (self *SUserResourceBase) GetOwnerId() mcclient.IIdentityProvider {
  122. owner := SOwnerId{UserId: self.OwnerId}
  123. return &owner
  124. }
  125. func (model *SUserResourceBase) IsOwner(userCred mcclient.TokenCredential) bool {
  126. return userCred.GetProjectId() == model.OwnerId
  127. }
  128. func (manager *SUserResourceBaseManager) GetIUserModelManager() IUserModelManager {
  129. return manager.GetVirtualObject().(IUserModelManager)
  130. }
  131. func (manager *SUserResourceBaseManager) FetchByName(ctx context.Context, userCred mcclient.IIdentityProvider, idStr string) (IModel, error) {
  132. return FetchByName(ctx, manager, userCred, idStr)
  133. }
  134. func (manager *SUserResourceBaseManager) FetchByIdOrName(ctx context.Context, userCred mcclient.IIdentityProvider, idStr string) (IModel, error) {
  135. return FetchByIdOrName(ctx, manager, userCred, idStr)
  136. }
  137. func (manager *SUserResourceBaseManager) ValidateCreateData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, input apis.UserResourceCreateInput) (apis.UserResourceCreateInput, error) {
  138. if len(input.OwnerId) == 0 {
  139. input.OwnerId = userCred.GetUserId()
  140. }
  141. var err error
  142. input.StandaloneResourceCreateInput, err = manager.SStandaloneResourceBaseManager.ValidateCreateData(ctx, userCred, ownerId, query, input.StandaloneResourceCreateInput)
  143. if err != nil {
  144. return input, errors.Wrap(err, "SStandaloneResourceBaseManager.ValidateCreateData")
  145. }
  146. return input, nil
  147. }
  148. func (manager *SUserResourceBaseManager) FetchOwnerId(ctx context.Context, data jsonutils.JSONObject) (mcclient.IIdentityProvider, error) {
  149. return FetchUserInfo(ctx, data)
  150. }
  151. func (manager *SUserResourceBaseManager) NamespaceScope() rbacscope.TRbacScope {
  152. return rbacscope.ScopeUser
  153. }
  154. func (manager *SUserResourceBaseManager) ResourceScope() rbacscope.TRbacScope {
  155. return rbacscope.ScopeUser
  156. }