forgejo/models/user/federated_user.go
2025-03-11 14:10:34 +01:00

66 lines
2.1 KiB
Go

// Copyright 2024 The Forgejo Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package user
import (
"context"
"code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/modules/validation"
)
type FederatedUser struct {
ID int64 `xorm:"pk autoincr"`
UserID int64 `xorm:"NOT NULL"`
ExternalID string `xorm:"UNIQUE(federation_user_mapping) NOT NULL"`
FederationHostID int64 `xorm:"UNIQUE(federation_user_mapping) NOT NULL"`
InboxURL *string
ActorURL *string
NormalizedFederatedURI string
}
func NewFederatedUser(userID int64, externalID string, federationHostID int64, normalizedFederatedURI string) (FederatedUser, error) {
result := FederatedUser{
UserID: userID,
ExternalID: externalID,
FederationHostID: federationHostID,
NormalizedFederatedURI: normalizedFederatedURI,
}
if valid, err := validation.IsValid(result); !valid {
return FederatedUser{}, err
}
return result, nil
}
func (user FederatedUser) Validate() []string {
var result []string
result = append(result, validation.ValidateNotEmpty(user.UserID, "UserID")...)
result = append(result, validation.ValidateNotEmpty(user.ExternalID, "ExternalID")...)
result = append(result, validation.ValidateNotEmpty(user.FederationHostID, "FederationHostID")...)
return result
}
func (user *FederatedUser) SetInboxURL(ctx context.Context, url *string) error {
user.InboxURL = url
_, err := db.GetEngine(ctx).ID(user.ID).Cols("inbox_url").Update(user)
return err
}
func GetFederatedUserByID(ctx context.Context, id int64) (*FederatedUser, error) {
var user FederatedUser
_, err := db.GetEngine(ctx).Where("id = ?", id).Get(&user)
if err != nil {
return nil, err
}
return &user, nil
}
func GetUserByActorURL(ctx context.Context, actorURL string) (*User, error) {
var user User
_, err := db.GetEngine(ctx).Table("`user`").Join("INNER", "`federated_user`", "`user`.id = `federated_user`.user_id").Where("`federated_user`.actor_url = ?", actorURL).Get(&user)
if err != nil {
return nil, err
}
return &user, nil
}