GetOwnedOrgsByUserIDDesc

This commit is contained in:
Joe Chen 2023-11-04 21:33:33 -04:00
parent a18290d166
commit 849d281bfa
No known key found for this signature in database
GPG Key ID: 0BDE5280C552FF60
3 changed files with 44 additions and 30 deletions

View File

@ -8,23 +8,8 @@ import (
"fmt" "fmt"
"xorm.io/builder" "xorm.io/builder"
"xorm.io/xorm"
) )
// getOwnedOrgsByUserID returns a list of organizations are owned by given user ID.
func getOwnedOrgsByUserID(sess *xorm.Session, userID int64) ([]*User, error) {
orgs := make([]*User, 0, 10)
return orgs, sess.Where("`org_user`.uid=?", userID).And("`org_user`.is_owner=?", true).
Join("INNER", "`org_user`", "`org_user`.org_id=`user`.id").Find(&orgs)
}
// GetOwnedOrganizationsByUserIDDesc returns a list of organizations are owned by
// given user ID, ordered descending by the given condition.
func GetOwnedOrgsByUserIDDesc(userID int64, desc string) ([]*User, error) {
sess := x.NewSession()
return getOwnedOrgsByUserID(sess.Desc(desc), userID)
}
// getOrgUsersByOrgID returns all organization-user relations by organization ID. // getOrgUsersByOrgID returns all organization-user relations by organization ID.
func getOrgUsersByOrgID(e Engine, orgID int64, limit int) ([]*OrgUser, error) { func getOrgUsersByOrgID(e Engine, orgID int64, limit int) ([]*OrgUser, error) {
orgUsers := make([]*OrgUser, 0, 10) orgUsers := make([]*OrgUser, 0, 10)

View File

@ -215,8 +215,15 @@ func (db *organizations) RemoveMember(ctx context.Context, orgID, userID int64)
}) })
} }
type OrderBy int
const (
OrderByIDAsc OrderBy = iota + 1
OrderByUpdatedDesc
)
type accessibleRepositoriesByUserOptions struct { type accessibleRepositoriesByUserOptions struct {
orderBy string orderBy OrderBy
page int page int
pageSize int pageSize int
} }
@ -249,8 +256,8 @@ func (*organizations) accessibleRepositoriesByUser(tx *gorm.DB, orgID, userID in
). ).
Or("repository.is_private = ? AND repository.is_unlisted = ?", false, false), Or("repository.is_private = ? AND repository.is_unlisted = ?", false, false),
) )
if opts.orderBy != "" { if opts.orderBy == OrderByUpdatedDesc {
conds.Order(opts.orderBy) conds.Order("updated_unix DESC")
} }
if opts.page > 0 && opts.pageSize > 0 { if opts.page > 0 && opts.pageSize > 0 {
conds.Limit(opts.pageSize).Offset((opts.page - 1) * opts.pageSize) conds.Limit(opts.pageSize).Offset((opts.page - 1) * opts.pageSize)
@ -269,7 +276,7 @@ func (db *organizations) AccessibleRepositoriesByUser(ctx context.Context, orgID
orgID, orgID,
userID, userID,
accessibleRepositoriesByUserOptions{ accessibleRepositoriesByUserOptions{
orderBy: "updated_unix DESC", orderBy: OrderByUpdatedDesc,
page: page, page: page,
pageSize: pageSize, pageSize: pageSize,
}, },
@ -339,10 +346,18 @@ func (db *organizations) ListMembers(ctx context.Context, orgID int64, opts List
} }
type ListOrganizationsOptions struct { type ListOrganizationsOptions struct {
// Filter by the membership with the given user ID. // Filter by the membership with the given user ID. It cannot be set when the
// OwnerID is also set.
MemberID int64 MemberID int64
// Filter by the ownership with the given user ID. It cannot be set when the
// MemberID is also set.
OwnerID int64
// Whether to include private memberships. // Whether to include private memberships.
IncludePrivateMembers bool IncludePrivateMembers bool
// Order by the given field and direction. Default is OrderByIDAsc.
OrderBy OrderBy
// 1-based page number. // 1-based page number.
Page int Page int
// Number of results per page. // Number of results per page.
@ -350,8 +365,8 @@ type ListOrganizationsOptions struct {
} }
func (db *organizations) List(ctx context.Context, opts ListOrganizationsOptions) ([]*Organization, error) { func (db *organizations) List(ctx context.Context, opts ListOrganizationsOptions) ([]*Organization, error) {
if opts.MemberID <= 0 { if opts.MemberID > 0 && opts.OwnerID > 0 {
return nil, errors.New("MemberID must be greater than 0") return nil, errors.New("cannot filter by both MemberID and OwnerID")
} }
/* /*
@ -361,24 +376,32 @@ func (db *organizations) List(ctx context.Context, opts ListOrganizationsOptions
[JOIN org_user ON org_user.org_id = user.id] [JOIN org_user ON org_user.org_id = user.id]
WHERE WHERE
type = @type type = @type
[AND org_user.uid = @memberID [AND org_user.uid = (@memberID | @ownerID)
AND org_user.is_public = @includePrivateMembers] AND org_user.is_public = @includePrivateMembers
ORDER BY user.id ASC AND org_user.is_owner = @ownerID > 0]
ORDER BY (user.id ASC | user.updated_unix DESC)
[LIMIT @limit OFFSET @offset] [LIMIT @limit OFFSET @offset]
*/ */
conds := db.WithContext(ctx). conds := db.WithContext(ctx).Where("type = ?", UserTypeOrganization)
Where("type = ?", UserTypeOrganization).
Order(dbutil.Quote("%s.id ASC", "user"))
if opts.MemberID > 0 || !opts.IncludePrivateMembers { if opts.MemberID > 0 || opts.OwnerID > 0 || !opts.IncludePrivateMembers {
conds.Joins(dbutil.Quote("JOIN org_user ON org_user.org_id = %s.id", "user")) conds.Joins(dbutil.Quote("JOIN org_user ON org_user.org_id = %s.id", "user"))
} }
if opts.MemberID > 0 { if opts.MemberID > 0 {
conds.Where("org_user.uid = ?", opts.MemberID) conds.Where("org_user.uid = ?", opts.MemberID)
} else if opts.OwnerID > 0 {
conds.Where("org_user.uid = ? AND org_user.is_owner = ?", opts.OwnerID, true)
} }
if !opts.IncludePrivateMembers { if !opts.IncludePrivateMembers {
conds.Where("org_user.is_public = ?", true) conds.Where("org_user.is_public = ?", true)
} }
if opts.OrderBy == OrderByUpdatedDesc {
conds.Order(dbutil.Quote("%s.updated_unix DESC", "user"))
} else {
conds.Order(dbutil.Quote("%s.id ASC", "user"))
}
if opts.Page > 0 && opts.PageSize > 0 { if opts.Page > 0 && opts.PageSize > 0 {
conds.Limit(opts.PageSize).Offset((opts.Page - 1) * opts.PageSize) conds.Limit(opts.PageSize).Offset((opts.Page - 1) * opts.PageSize)
} }

View File

@ -35,7 +35,13 @@ func MustBeNotBare(c *context.Context) {
} }
func checkContextUser(c *context.Context, uid int64) *db.User { func checkContextUser(c *context.Context, uid int64) *db.User {
orgs, err := db.GetOwnedOrgsByUserIDDesc(c.User.ID, "updated_unix") orgs, err := db.Organizations.List(
c.Req.Context(),
db.ListOrganizationsOptions{
OwnerID: c.User.ID,
OrderBy: db.OrderByUpdatedDesc,
},
)
if err != nil { if err != nil {
c.Error(err, "get owned organization by user ID") c.Error(err, "get owned organization by user ID")
return nil return nil