feat(user): add is_external flag, will permit integration of external users (without any storage) but able to be invited

This commit is contained in:
Edouard Vanbelle
2026-06-01 15:51:05 +02:00
parent bb6429a620
commit e130842bfc
8 changed files with 226 additions and 28 deletions
@@ -84,13 +84,13 @@ impl UserRepository for UserPgRepository {
let _result = sqlx::query(
r#"
INSERT INTO auth.users (
id, username, email, password_hash, role,
storage_quota_bytes, storage_used_bytes,
id, username, email, password_hash, role,
storage_quota_bytes, storage_used_bytes,
created_at, updated_at, last_login_at, active,
oidc_provider, oidc_subject
oidc_provider, oidc_subject, is_external
) VALUES (
$1, $2, $3, $4, $5::auth.userrole, $6, $7, $8, $9, $10, $11,
$12, $13
$12, $13, $14
)
RETURNING *
"#,
@@ -108,6 +108,7 @@ impl UserRepository for UserPgRepository {
.bind(user_clone.is_active())
.bind(user_clone.oidc_provider())
.bind(user_clone.oidc_subject())
.bind(user_clone.is_external())
.execute(&mut **tx)
.await
.map_err(Self::map_sqlx_error)?;
@@ -131,7 +132,7 @@ impl UserRepository for UserPgRepository {
id, username, email, password_hash, role::text as role_text,
storage_quota_bytes, storage_used_bytes,
created_at, updated_at, last_login_at, active,
oidc_provider, oidc_subject, image
oidc_provider, oidc_subject, image, is_external
FROM auth.users
WHERE id = $1
"#,
@@ -163,6 +164,7 @@ impl UserRepository for UserPgRepository {
row.get("oidc_provider"),
row.get("oidc_subject"),
row.get("image"),
row.get("is_external"),
))
}
@@ -174,7 +176,7 @@ impl UserRepository for UserPgRepository {
id, username, email, password_hash, role::text as role_text,
storage_quota_bytes, storage_used_bytes,
created_at, updated_at, last_login_at, active,
oidc_provider, oidc_subject, image
oidc_provider, oidc_subject, image, is_external
FROM auth.users
WHERE username = $1
"#,
@@ -206,6 +208,7 @@ impl UserRepository for UserPgRepository {
row.get("oidc_provider"),
row.get("oidc_subject"),
row.get("image"),
row.get("is_external"),
))
}
@@ -217,7 +220,7 @@ impl UserRepository for UserPgRepository {
id, username, email, password_hash, role::text as role_text,
storage_quota_bytes, storage_used_bytes,
created_at, updated_at, last_login_at, active,
oidc_provider, oidc_subject, image
oidc_provider, oidc_subject, image, is_external
FROM auth.users
WHERE email = $1
"#,
@@ -249,6 +252,7 @@ impl UserRepository for UserPgRepository {
row.get("oidc_provider"),
row.get("oidc_subject"),
row.get("image"),
row.get("is_external"),
))
}
@@ -354,7 +358,7 @@ impl UserRepository for UserPgRepository {
id, username, email, password_hash, role::text as role_text,
storage_quota_bytes, storage_used_bytes,
created_at, updated_at, last_login_at, active,
oidc_provider, oidc_subject, image
oidc_provider, oidc_subject, image, is_external
FROM auth.users
ORDER BY created_at DESC
LIMIT $1 OFFSET $2
@@ -391,6 +395,7 @@ impl UserRepository for UserPgRepository {
row.get("oidc_provider"),
row.get("oidc_subject"),
row.get("image"),
row.get("is_external"),
)
})
.collect();
@@ -406,7 +411,7 @@ impl UserRepository for UserPgRepository {
id, username, email, password_hash, role::text as role_text,
storage_quota_bytes, storage_used_bytes,
created_at, updated_at, last_login_at, active,
oidc_provider, oidc_subject, image
oidc_provider, oidc_subject, image, is_external
FROM auth.users
WHERE username ILIKE $1 OR email ILIKE $1
ORDER BY username
@@ -443,6 +448,7 @@ impl UserRepository for UserPgRepository {
row.get("oidc_provider"),
row.get("oidc_subject"),
row.get("image"),
row.get("is_external"),
)
})
.collect();
@@ -529,7 +535,7 @@ impl UserRepository for UserPgRepository {
id, username, email, password_hash, role::text as role_text,
storage_quota_bytes, storage_used_bytes,
created_at, updated_at, last_login_at, active,
oidc_provider, oidc_subject, image
oidc_provider, oidc_subject, image, is_external
FROM auth.users
WHERE role::text = $1
ORDER BY created_at DESC
@@ -565,6 +571,7 @@ impl UserRepository for UserPgRepository {
row.get("oidc_provider"),
row.get("oidc_subject"),
row.get("image"),
row.get("is_external"),
)
})
.collect();
@@ -600,7 +607,7 @@ impl UserRepository for UserPgRepository {
id, username, email, password_hash, role::text as role_text,
storage_quota_bytes, storage_used_bytes,
created_at, updated_at, last_login_at, active,
oidc_provider, oidc_subject, image
oidc_provider, oidc_subject, image, is_external
FROM auth.users
WHERE oidc_provider = $1 AND oidc_subject = $2
"#,
@@ -632,6 +639,7 @@ impl UserRepository for UserPgRepository {
row.get("oidc_provider"),
row.get("oidc_subject"),
row.get("image"),
row.get("is_external"),
))
}