Validate new user-provided IDs using the AIP-122 format while retaining legacy UID compatibility. Correct resource annotations and canonical names returned by user stats.
47 lines
1.3 KiB
Go
47 lines
1.3 KiB
Go
package v1
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/pkg/errors"
|
|
|
|
"github.com/usememos/memos/internal/base"
|
|
"github.com/usememos/memos/store"
|
|
)
|
|
|
|
// BuildUserName returns the canonical public resource name for a user.
|
|
func BuildUserName(username string) string {
|
|
return UserNamePrefix + username
|
|
}
|
|
|
|
func parseUsernameFromName(name string) (string, error) {
|
|
tokens, err := GetNameParentTokens(name, UserNamePrefix)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
username := tokens[0]
|
|
if username == "" {
|
|
return "", errors.Errorf("invalid user name %q", name)
|
|
}
|
|
return username, nil
|
|
}
|
|
|
|
func validateWritableUsername(username string) error {
|
|
if !base.ResourceIDMatcher.MatchString(username) {
|
|
return errors.New("invalid username: must be 1-63 characters, start with a lowercase letter, contain only lowercase letters, digits, or hyphens, and end with a letter or digit")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// ResolveUserByName resolves a username-based user resource name to a store user.
|
|
func ResolveUserByName(ctx context.Context, stores *store.Store, name string) (*store.User, error) {
|
|
username, err := parseUsernameFromName(name)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
user, err := stores.GetUser(ctx, &store.FindUser{Username: &username})
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "resolve user by name: GetUser failed")
|
|
}
|
|
return user, nil
|
|
}
|