user tenant_id
This commit is contained in:
+2
-1
@@ -20,7 +20,7 @@ COPY migrations ./migrations
|
|||||||
COPY tests ./tests
|
COPY tests ./tests
|
||||||
COPY diesel.toml ./
|
COPY diesel.toml ./
|
||||||
|
|
||||||
RUN cargo build --release --bin backend --bin worker --bin webdav
|
RUN cargo build --release --bin backend --bin worker --bin webdav --bin admin
|
||||||
RUN cargo install diesel_cli --no-default-features --features postgres
|
RUN cargo install diesel_cli --no-default-features --features postgres
|
||||||
|
|
||||||
FROM debian:trixie-slim AS runtime
|
FROM debian:trixie-slim AS runtime
|
||||||
@@ -53,6 +53,7 @@ RUN apt-get update \
|
|||||||
COPY --from=builder /app/target/release/backend /usr/local/bin/papercrate-backend
|
COPY --from=builder /app/target/release/backend /usr/local/bin/papercrate-backend
|
||||||
COPY --from=builder /app/target/release/worker /usr/local/bin/papercrate-worker
|
COPY --from=builder /app/target/release/worker /usr/local/bin/papercrate-worker
|
||||||
COPY --from=builder /app/target/release/webdav /usr/local/bin/papercrate-webdav
|
COPY --from=builder /app/target/release/webdav /usr/local/bin/papercrate-webdav
|
||||||
|
COPY --from=builder /app/target/release/admin /usr/local/bin/papercrate-admin
|
||||||
COPY --from=builder /usr/local/cargo/bin/diesel /usr/local/bin/diesel
|
COPY --from=builder /usr/local/cargo/bin/diesel /usr/local/bin/diesel
|
||||||
COPY migrations ./migrations
|
COPY migrations ./migrations
|
||||||
COPY diesel.toml ./
|
COPY diesel.toml ./
|
||||||
|
|||||||
@@ -91,19 +91,15 @@ CREATE INDEX folders_tenant_id_idx ON folders (tenant_id);
|
|||||||
|
|
||||||
-- Add tenant_id to users
|
-- Add tenant_id to users
|
||||||
ALTER TABLE users ADD COLUMN tenant_id UUID;
|
ALTER TABLE users ADD COLUMN tenant_id UUID;
|
||||||
UPDATE users
|
|
||||||
SET tenant_id = (SELECT tenant_id FROM public.tenants WHERE slug = 'admin');
|
|
||||||
ALTER TABLE users ALTER COLUMN tenant_id SET NOT NULL;
|
|
||||||
ALTER TABLE users
|
|
||||||
ADD CONSTRAINT users_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(tenant_id);
|
|
||||||
CREATE INDEX users_tenant_id_idx ON users (tenant_id);
|
|
||||||
|
|
||||||
-- Add tenant_id to refresh_tokens
|
-- Add tenant_id to refresh_tokens
|
||||||
ALTER TABLE refresh_tokens ADD COLUMN tenant_id UUID;
|
ALTER TABLE refresh_tokens ADD COLUMN tenant_id UUID;
|
||||||
UPDATE refresh_tokens AS rt
|
UPDATE refresh_tokens AS rt
|
||||||
SET tenant_id = u.tenant_id
|
SET tenant_id = (
|
||||||
FROM users AS u
|
SELECT um.tenant_id
|
||||||
WHERE rt.user_id = u.id;
|
FROM user_memberships AS um
|
||||||
|
WHERE um.user_id = rt.user_id
|
||||||
|
LIMIT 1
|
||||||
|
);
|
||||||
ALTER TABLE refresh_tokens ALTER COLUMN tenant_id SET NOT NULL;
|
ALTER TABLE refresh_tokens ALTER COLUMN tenant_id SET NOT NULL;
|
||||||
ALTER TABLE refresh_tokens
|
ALTER TABLE refresh_tokens
|
||||||
ADD CONSTRAINT refresh_tokens_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(tenant_id);
|
ADD CONSTRAINT refresh_tokens_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(tenant_id);
|
||||||
@@ -112,7 +108,12 @@ CREATE INDEX refresh_tokens_tenant_id_idx ON refresh_tokens (tenant_id);
|
|||||||
-- Add tenant_id to jobs
|
-- Add tenant_id to jobs
|
||||||
ALTER TABLE jobs ADD COLUMN tenant_id UUID;
|
ALTER TABLE jobs ADD COLUMN tenant_id UUID;
|
||||||
UPDATE jobs
|
UPDATE jobs
|
||||||
SET tenant_id = (SELECT tenant_id FROM public.tenants WHERE slug = 'admin');
|
SET tenant_id = (
|
||||||
|
SELECT um.tenant_id
|
||||||
|
FROM user_memberships AS um
|
||||||
|
WHERE um.user_id = jobs.user_id
|
||||||
|
LIMIT 1
|
||||||
|
);
|
||||||
ALTER TABLE jobs ALTER COLUMN tenant_id SET NOT NULL;
|
ALTER TABLE jobs ALTER COLUMN tenant_id SET NOT NULL;
|
||||||
ALTER TABLE jobs
|
ALTER TABLE jobs
|
||||||
ADD CONSTRAINT jobs_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(tenant_id);
|
ADD CONSTRAINT jobs_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(tenant_id);
|
||||||
|
|||||||
@@ -0,0 +1,2 @@
|
|||||||
|
DROP INDEX IF EXISTS tenants_quickwit_index_unique;
|
||||||
|
DROP INDEX IF EXISTS tenants_storage_root_unique;
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
CREATE UNIQUE INDEX tenants_storage_root_unique
|
||||||
|
ON public.tenants (storage_root)
|
||||||
|
WHERE storage_root IS NOT NULL;
|
||||||
|
|
||||||
|
CREATE UNIQUE INDEX tenants_quickwit_index_unique
|
||||||
|
ON public.tenants (quickwit_index)
|
||||||
|
WHERE quickwit_index IS NOT NULL;
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
ALTER TABLE users ADD COLUMN tenant_id UUID;
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
ALTER TABLE users DROP CONSTRAINT IF EXISTS users_tenant_id_fkey;
|
||||||
|
DROP INDEX IF EXISTS users_tenant_id_idx;
|
||||||
|
ALTER TABLE users DROP COLUMN IF EXISTS tenant_id;
|
||||||
@@ -20,7 +20,7 @@ use backend::{
|
|||||||
|
|
||||||
static QUICKWIT_INDEX_TEMPLATE: Lazy<serde_json::Value> = Lazy::new(|| {
|
static QUICKWIT_INDEX_TEMPLATE: Lazy<serde_json::Value> = Lazy::new(|| {
|
||||||
json!({
|
json!({
|
||||||
"version": 0.8,
|
"version": "0.8",
|
||||||
"index_id": "documents",
|
"index_id": "documents",
|
||||||
"doc_mapping": {
|
"doc_mapping": {
|
||||||
"tokenizers": [
|
"tokenizers": [
|
||||||
@@ -56,7 +56,7 @@ enum Command {
|
|||||||
|
|
||||||
impl Command {
|
impl Command {
|
||||||
fn usage() -> &'static str {
|
fn usage() -> &'static str {
|
||||||
"Usage: maintenance <list-tenants|delete-assets <slug>|quickwit-create-index <slug>|quickwit-delete-index <slug>>"
|
"Usage: admin <list-tenants|delete-assets <slug>|quickwit-create-index <slug>|quickwit-delete-index <slug>>"
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse() -> Result<Self> {
|
fn parse() -> Result<Self> {
|
||||||
@@ -81,7 +81,7 @@ impl Command {
|
|||||||
async fn main() -> Result<()> {
|
async fn main() -> Result<()> {
|
||||||
init_tracing("info");
|
init_tracing("info");
|
||||||
let command = Command::parse()?;
|
let command = Command::parse()?;
|
||||||
let config = AppConfig::load_and_log("maintenance")?;
|
let config = AppConfig::load_and_log("admin")?;
|
||||||
let pool = db::init_pool_with_size(&config.database_url, config.database_max_pool_size)?;
|
let pool = db::init_pool_with_size(&config.database_url, config.database_max_pool_size)?;
|
||||||
|
|
||||||
match command {
|
match command {
|
||||||
@@ -48,7 +48,6 @@ pub struct User {
|
|||||||
pub password_hash: String,
|
pub password_hash: String,
|
||||||
pub created_at: NaiveDateTime,
|
pub created_at: NaiveDateTime,
|
||||||
pub updated_at: NaiveDateTime,
|
pub updated_at: NaiveDateTime,
|
||||||
pub tenant_id: Uuid,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Insertable)]
|
#[derive(Debug, Insertable)]
|
||||||
@@ -57,7 +56,6 @@ pub struct NewUser {
|
|||||||
pub id: Uuid,
|
pub id: Uuid,
|
||||||
pub username: String,
|
pub username: String,
|
||||||
pub password_hash: String,
|
pub password_hash: String,
|
||||||
pub tenant_id: Uuid,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Queryable, Identifiable)]
|
#[derive(Debug, Clone, Queryable, Identifiable)]
|
||||||
|
|||||||
@@ -183,7 +183,6 @@ diesel::table! {
|
|||||||
password_hash -> Varchar,
|
password_hash -> Varchar,
|
||||||
created_at -> Timestamptz,
|
created_at -> Timestamptz,
|
||||||
updated_at -> Timestamptz,
|
updated_at -> Timestamptz,
|
||||||
tenant_id -> Uuid,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -210,7 +209,6 @@ diesel::joinable!(refresh_tokens -> users (user_id));
|
|||||||
diesel::joinable!(tags -> tenants (tenant_id));
|
diesel::joinable!(tags -> tenants (tenant_id));
|
||||||
diesel::joinable!(user_memberships -> tenants (tenant_id));
|
diesel::joinable!(user_memberships -> tenants (tenant_id));
|
||||||
diesel::joinable!(user_memberships -> users (user_id));
|
diesel::joinable!(user_memberships -> users (user_id));
|
||||||
diesel::joinable!(users -> tenants (tenant_id));
|
|
||||||
|
|
||||||
diesel::allow_tables_to_appear_in_same_query!(
|
diesel::allow_tables_to_appear_in_same_query!(
|
||||||
correspondents,
|
correspondents,
|
||||||
|
|||||||
@@ -62,12 +62,13 @@ impl AppState {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn db_for_tenant(&self, tenant_id: Uuid) -> AppResult<PgPooledConnection> {
|
pub fn db_for_tenant(&self, tenant_id: Uuid) -> AppResult<PgPooledConnection> {
|
||||||
|
debug_assert!(!tenant_id.is_nil(), "nil tenant_id passed to db_for_tenant");
|
||||||
let mut conn = self.db_unscoped()?;
|
let mut conn = self.db_unscoped()?;
|
||||||
apply_tenant_guc(&mut conn, tenant_id)?;
|
apply_tenant_guc(&mut conn, tenant_id)?;
|
||||||
Ok(conn)
|
Ok(conn)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn db_unscoped(&self) -> AppResult<PgPooledConnection> {
|
pub(crate) fn db_unscoped(&self) -> AppResult<PgPooledConnection> {
|
||||||
self.pool
|
self.pool
|
||||||
.get()
|
.get()
|
||||||
.map_err(|err| AppError::internal(format!("database pool error: {err}")))
|
.map_err(|err| AppError::internal(format!("database pool error: {err}")))
|
||||||
|
|||||||
@@ -191,7 +191,6 @@ impl TestApp {
|
|||||||
id: Uuid::new_v4(),
|
id: Uuid::new_v4(),
|
||||||
username,
|
username,
|
||||||
password_hash,
|
password_hash,
|
||||||
tenant_id,
|
|
||||||
};
|
};
|
||||||
diesel::insert_into(backend::schema::users::table)
|
diesel::insert_into(backend::schema::users::table)
|
||||||
.values(&user)
|
.values(&user)
|
||||||
|
|||||||
Reference in New Issue
Block a user