slapid and player now links when registering
This commit is contained in:
@@ -12,16 +12,20 @@ import (
|
||||
|
||||
"git.haelnorr.com/h/oslstats/internal/config"
|
||||
"git.haelnorr.com/h/oslstats/internal/db"
|
||||
"git.haelnorr.com/h/oslstats/internal/discord"
|
||||
"git.haelnorr.com/h/oslstats/internal/rbac"
|
||||
"git.haelnorr.com/h/oslstats/internal/respond"
|
||||
"git.haelnorr.com/h/oslstats/internal/store"
|
||||
"git.haelnorr.com/h/oslstats/internal/throw"
|
||||
authview "git.haelnorr.com/h/oslstats/internal/view/authview"
|
||||
"git.haelnorr.com/h/oslstats/pkg/slapshotapi"
|
||||
)
|
||||
|
||||
func Register(
|
||||
s *hws.Server,
|
||||
auth *hwsauth.Authenticator[*db.User, bun.Tx],
|
||||
conn *db.DB,
|
||||
slapAPI *slapshotapi.SlapAPI,
|
||||
cfg *config.Config,
|
||||
store *store.Store,
|
||||
) http.Handler {
|
||||
@@ -56,6 +60,7 @@ func Register(
|
||||
username := r.FormValue("username")
|
||||
unique := false
|
||||
var user *db.User
|
||||
audit := db.NewAudit(r.RemoteAddr, r.UserAgent(), user)
|
||||
if ok := conn.WithNotifyTx(s, w, r, func(ctx context.Context, tx bun.Tx) (bool, error) {
|
||||
unique, err = db.IsUnique(ctx, tx, (*db.User)(nil), "username", username)
|
||||
if err != nil {
|
||||
@@ -64,19 +69,13 @@ func Register(
|
||||
if !unique {
|
||||
return true, nil
|
||||
}
|
||||
user, err = db.CreateUser(ctx, tx, username, details.DiscordUser, db.NewAuditFromRequest(r))
|
||||
user, err = registerUser(ctx, tx, username, details, cfg.RBAC, audit)
|
||||
if err != nil {
|
||||
return false, errors.Wrap(err, "db.CreateUser")
|
||||
return false, errors.Wrap(err, "registerUser")
|
||||
}
|
||||
err = user.UpdateDiscordToken(ctx, tx, details.Token)
|
||||
err = connectSlapID(ctx, tx, user, details.Token, slapAPI, audit)
|
||||
if err != nil {
|
||||
return false, errors.Wrap(err, "db.UpdateDiscordToken")
|
||||
}
|
||||
if shouldGrantAdmin(user, cfg.RBAC) {
|
||||
err := ensureUserHasAdminRole(ctx, tx, user)
|
||||
if err != nil {
|
||||
return false, errors.Wrap(err, "ensureUserHasAdminRole")
|
||||
}
|
||||
return false, errors.Wrap(err, "connectSlapID")
|
||||
}
|
||||
return true, nil
|
||||
}); !ok {
|
||||
@@ -96,3 +95,62 @@ func Register(
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
func registerUser(ctx context.Context, tx bun.Tx,
|
||||
username string, details *store.RegistrationSession,
|
||||
rbac *rbac.Config, audit *db.AuditMeta,
|
||||
) (*db.User, error) {
|
||||
// Register the user
|
||||
user, err := db.CreateUser(ctx, tx, username, details.DiscordUser, audit)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "db.CreateUser")
|
||||
}
|
||||
err = user.UpdateDiscordToken(ctx, tx, details.Token)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "db.UpdateDiscordToken")
|
||||
}
|
||||
err = user.ConnectPlayer(ctx, tx, audit)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "db.ConnectPlayer")
|
||||
}
|
||||
// Check if they should be an admin
|
||||
if shouldGrantAdmin(user, rbac) {
|
||||
err := ensureUserHasAdminRole(ctx, tx, user)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "ensureUserHasAdminRole")
|
||||
}
|
||||
}
|
||||
return user, nil
|
||||
}
|
||||
|
||||
func connectSlapID(ctx context.Context, tx bun.Tx, user *db.User,
|
||||
token *discord.Token, slapAPI *slapshotapi.SlapAPI, audit *db.AuditMeta,
|
||||
) error {
|
||||
// Attempt to setup their player/slapID from steam connection
|
||||
// If fails due to no steam connection or no slapID, fail silently and proceed with registration
|
||||
session, err := discord.NewOAuthSession(token)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "discord.NewOAuthSession")
|
||||
}
|
||||
steamID, err := session.GetSteamID()
|
||||
if err != nil {
|
||||
if err == discord.ErrNoSteam {
|
||||
return nil
|
||||
}
|
||||
return errors.Wrap(err, "session.GetSteamID")
|
||||
}
|
||||
slapID, err := slapAPI.GetSlapID(ctx, steamID)
|
||||
if err != nil {
|
||||
if err == slapshotapi.ErrNoSlapID {
|
||||
return nil
|
||||
}
|
||||
return errors.Wrap(err, "slapAPI.GetSlapID")
|
||||
}
|
||||
// slapID exists, we can update their player connection
|
||||
err = db.UpdatePlayerSlapID(ctx, tx, user.Player.ID, slapID, audit)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "db.UpdatePlayerSlapID")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user