diff --git a/README.md b/README.md index 50b120f..6513857 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Paperless-NEO +# Papercrate ## Backend Integration Tests @@ -6,7 +6,7 @@ Integration tests require a running Postgres instance (and, optionally, Quickwit ```bash docker compose -f docker-compose.test.yml up -d -export TEST_DATABASE_URL=postgres://paperless:paperless_test@localhost:5433/paperless_test +export TEST_DATABASE_URL=postgres://papercrate:papercrate_test@localhost:5433/papercrate_test # optional, enables Quickwit indexing jobs export QUICKWIT_ENDPOINT=http://localhost:7280 export QUICKWIT_INDEX=documents @@ -34,20 +34,20 @@ The backend container image ships the `diesel` CLI, so schema migrations can be apiVersion: batch/v1 kind: Job metadata: - name: paperless-migrate + name: papercrate-migrate spec: template: spec: restartPolicy: OnFailure containers: - name: migrate - image: ghcr.io/example/paperless-backend: + image: ghcr.io/example/papercrate-backend: command: ["/usr/local/bin/diesel", "migration", "run"] env: - name: DATABASE_URL valueFrom: secretKeyRef: - name: paperless-db + name: papercrate-db key: DATABASE_URL ``` diff --git a/backend/Cargo.lock b/backend/Cargo.lock index 3046600..46d76d7 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -2108,7 +2108,7 @@ dependencies = [ ] [[package]] -name = "paperless-backend" +name = "papercrate-backend" version = "0.1.0" dependencies = [ "anyhow", diff --git a/backend/Cargo.toml b/backend/Cargo.toml index 5076199..1e873f2 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "paperless-backend" +name = "papercrate-backend" version = "0.1.0" edition = "2021" diff --git a/backend/Dockerfile b/backend/Dockerfile index 153e474..1cad2b1 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -19,7 +19,7 @@ COPY migrations ./migrations COPY tests ./tests COPY diesel.toml ./ -RUN cargo build --release --bin paperless-backend --bin worker +RUN cargo build --release --bin papercrate-backend --bin worker RUN cargo install diesel_cli --no-default-features --features postgres FROM debian:bookworm-slim AS runtime @@ -35,8 +35,8 @@ RUN apt-get update \ && rm -rf /var/lib/apt/lists/* \ && useradd --system --create-home --uid 10001 appuser -COPY --from=builder /app/target/release/paperless-backend /usr/local/bin/paperless-backend -COPY --from=builder /app/target/release/worker /usr/local/bin/paperless-worker +COPY --from=builder /app/target/release/papercrate-backend /usr/local/bin/papercrate-backend +COPY --from=builder /app/target/release/worker /usr/local/bin/papercrate-worker COPY --from=builder /usr/local/cargo/bin/diesel /usr/local/bin/diesel COPY migrations ./migrations COPY diesel.toml ./ @@ -45,4 +45,4 @@ ENV RUST_LOG=info USER appuser EXPOSE 3000 -ENTRYPOINT ["/usr/local/bin/paperless-backend"] +ENTRYPOINT ["/usr/local/bin/papercrate-backend"] diff --git a/backend/src/bin/maintenance.rs b/backend/src/bin/maintenance.rs index 9a049b0..a3254cf 100644 --- a/backend/src/bin/maintenance.rs +++ b/backend/src/bin/maintenance.rs @@ -3,7 +3,7 @@ use std::env; use anyhow::{Context, Result}; use diesel::prelude::*; -use paperless_backend::{ +use papercrate_backend::{ config::AppConfig, db, models::DocumentAsset, diff --git a/backend/src/bin/worker.rs b/backend/src/bin/worker.rs index 8ae9f1a..64558da 100644 --- a/backend/src/bin/worker.rs +++ b/backend/src/bin/worker.rs @@ -3,7 +3,7 @@ use std::{sync::Arc, time::Duration}; use tokio::signal; use tracing_subscriber::EnvFilter; -use paperless_backend::{ +use papercrate_backend::{ auth::jwt::JwtService, config::AppConfig, db, default_handlers, s3::build_client, state::AppState, storage::S3Storage, Worker, }; diff --git a/backend/src/config.rs b/backend/src/config.rs index 89d35c4..3cfd708 100644 --- a/backend/src/config.rs +++ b/backend/src/config.rs @@ -35,15 +35,15 @@ impl AppConfig { .parse() .context("SERVER_PORT must be a valid u16")?; let jwt_secret = env::var("JWT_SECRET").context("JWT_SECRET must be set")?; - let jwt_issuer = env::var("JWT_ISSUER").unwrap_or_else(|_| "paperless-neo".to_string()); + let jwt_issuer = env::var("JWT_ISSUER").unwrap_or_else(|_| "papercrate".to_string()); let jwt_audience = - env::var("JWT_AUDIENCE").unwrap_or_else(|_| "paperless-neo-clients".to_string()); + env::var("JWT_AUDIENCE").unwrap_or_else(|_| "papercrate-clients".to_string()); let jwt_expiry_minutes = env::var("JWT_EXPIRY_MINUTES") .unwrap_or_else(|_| "60".to_string()) .parse() .context("JWT_EXPIRY_MINUTES must be an integer")?; let download_token_audience = env::var("DOWNLOAD_TOKEN_AUDIENCE") - .unwrap_or_else(|_| "paperless-neo-download".to_string()); + .unwrap_or_else(|_| "papercrate-download".to_string()); let download_token_expiry_minutes = env::var("DOWNLOAD_TOKEN_EXPIRY_MINUTES") .unwrap_or_else(|_| "60".to_string()) .parse() diff --git a/backend/src/main.rs b/backend/src/main.rs index 8362509..a9df5de 100644 --- a/backend/src/main.rs +++ b/backend/src/main.rs @@ -5,13 +5,13 @@ use tokio::net::TcpListener; use tower::make::Shared; use tracing_subscriber::EnvFilter; -use paperless_backend::auth::jwt::JwtService; -use paperless_backend::config::AppConfig; -use paperless_backend::db; -use paperless_backend::routes; -use paperless_backend::s3::build_client; -use paperless_backend::state::AppState; -use paperless_backend::storage::S3Storage; +use papercrate_backend::auth::jwt::JwtService; +use papercrate_backend::config::AppConfig; +use papercrate_backend::db; +use papercrate_backend::routes; +use papercrate_backend::s3::build_client; +use papercrate_backend::state::AppState; +use papercrate_backend::storage::S3Storage; #[tokio::main] async fn main() -> anyhow::Result<()> { diff --git a/backend/tests/common/mod.rs b/backend/tests/common/mod.rs index 5d749fc..1063aec 100644 --- a/backend/tests/common/mod.rs +++ b/backend/tests/common/mod.rs @@ -14,13 +14,13 @@ use diesel::PgConnection; use diesel_migrations::{embed_migrations, EmbeddedMigrations, MigrationHarness}; use http_body_util::BodyExt; use once_cell::sync::Lazy; -use paperless_backend::auth::jwt::JwtService; -use paperless_backend::config::AppConfig; -use paperless_backend::db::{self, PgPool}; -use paperless_backend::models::{Job, NewUser}; -use paperless_backend::routes; -use paperless_backend::state::AppState; -use paperless_backend::storage::ObjectStorage; +use papercrate_backend::auth::jwt::JwtService; +use papercrate_backend::config::AppConfig; +use papercrate_backend::db::{self, PgPool}; +use papercrate_backend::models::{Job, NewUser}; +use papercrate_backend::routes; +use papercrate_backend::state::AppState; +use papercrate_backend::storage::ObjectStorage; use rand::rngs::OsRng; use serde::Serialize; use tokio::sync::Mutex; @@ -183,7 +183,7 @@ impl TestApp { password_hash, role, }; - diesel::insert_into(paperless_backend::schema::users::table) + diesel::insert_into(papercrate_backend::schema::users::table) .values(&user) .execute(conn) .context("failed to insert user")?; @@ -225,7 +225,7 @@ impl TestApp { #[allow(dead_code)] pub async fn clear_jobs(&self) -> Result<()> { self.with_conn(|conn| { - use paperless_backend::schema::jobs::dsl::jobs as jobs_table; + use papercrate_backend::schema::jobs::dsl::jobs as jobs_table; diesel::delete(jobs_table) .execute(conn) .context("failed to clear jobs")?; @@ -238,7 +238,7 @@ impl TestApp { pub async fn jobs_by_type(&self, ty: &str) -> Result> { let ty = ty.to_string(); self.with_conn(move |conn| { - use paperless_backend::schema::jobs::dsl::{ + use papercrate_backend::schema::jobs::dsl::{ job_type as job_type_col, jobs as jobs_table, }; let rows = jobs_table diff --git a/docker-compose.test.yml b/docker-compose.test.yml index 6691fd5..ea2b6e1 100644 --- a/docker-compose.test.yml +++ b/docker-compose.test.yml @@ -2,15 +2,15 @@ services: postgres-test: image: postgres:16-alpine environment: - POSTGRES_USER: paperless - POSTGRES_PASSWORD: paperless_test - POSTGRES_DB: paperless_test + POSTGRES_USER: papercrate + POSTGRES_PASSWORD: papercrate_test + POSTGRES_DB: papercrate_test ports: - "5433:5432" tmpfs: - /var/lib/postgresql/data healthcheck: - test: ["CMD-SHELL", "pg_isready -U paperless"] + test: ["CMD-SHELL", "pg_isready -U papercrate"] interval: 5s timeout: 5s retries: 5 diff --git a/docker-compose.yml b/docker-compose.yml index f8e5323..9f23291 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,16 +2,16 @@ services: postgres: image: postgres:16-alpine environment: - POSTGRES_USER: paperless - POSTGRES_PASSWORD: paperless_dev - POSTGRES_DB: paperless + POSTGRES_USER: papercrate + POSTGRES_PASSWORD: papercrate_dev + POSTGRES_DB: papercrate ports: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data - ./backend/migrations:/docker-entrypoint-initdb.d healthcheck: - test: ["CMD-SHELL", "pg_isready -U paperless"] + test: ["CMD-SHELL", "pg_isready -U papercrate"] interval: 5s timeout: 5s retries: 5 diff --git a/docs/testing.md b/docs/testing.md index 6f9f81d..6bc1547 100644 --- a/docs/testing.md +++ b/docs/testing.md @@ -6,10 +6,10 @@ The backend integration tests talk to a real Postgres database. To spin up an ep docker compose -f docker-compose.test.yml up -d ``` -This starts Postgres on port `5433` with the database/user both named `paperless` and password `paperless_test`. Point the test harness at it: +This starts Postgres on port `5433` with the database/user both named `papercrate` and password `papercrate_test`. Point the test harness at it: ```bash -export TEST_DATABASE_URL=postgres://paperless:paperless_test@localhost:5433/paperless_test +export TEST_DATABASE_URL=postgres://papercrate:papercrate_test@localhost:5433/papercrate_test ``` Run the tests as usual: diff --git a/frontend/README.md b/frontend/README.md index 0e3f155..3cbaaaa 100644 --- a/frontend/README.md +++ b/frontend/README.md @@ -1,6 +1,6 @@ -# Paperless-NEO Frontend +# Papercrate Frontend -A minimal Webpack-powered SPA to interact with the Paperless-NEO Milestone 1 backend. +A minimal Webpack-powered SPA to interact with the Papercrate Milestone 1 backend. ## Prerequisites diff --git a/frontend/package-lock.json b/frontend/package-lock.json index b21d709..1259bb0 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,11 +1,11 @@ { - "name": "paperless-neo-frontend", + "name": "papercrate-frontend", "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "paperless-neo-frontend", + "name": "papercrate-frontend", "version": "0.1.0", "dependencies": { "axios": "1.7.7", diff --git a/frontend/package.json b/frontend/package.json index 337c52a..41a215a 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,8 +1,8 @@ { - "name": "paperless-neo-frontend", + "name": "papercrate-frontend", "version": "0.1.0", "private": true, - "description": "Rudimentary Webpack SPA for Paperless-NEO Milestone 1", + "description": "Rudimentary Webpack SPA for Papercrate Milestone 1", "scripts": { "dev": "webpack serve --mode development --open", "build": "webpack --mode production", diff --git a/frontend/src/index.html b/frontend/src/index.html index f3bb0cb..d5cc24a 100644 --- a/frontend/src/index.html +++ b/frontend/src/index.html @@ -3,7 +3,7 @@ - Paperless-NEO + Papercrate
diff --git a/frontend/src/index.jsx b/frontend/src/index.jsx index 39ac048..a372f95 100644 --- a/frontend/src/index.jsx +++ b/frontend/src/index.jsx @@ -28,7 +28,7 @@ const api = axios.create({ withCredentials: true, }); -const STORED_TOKEN = window.localStorage.getItem('paperless_token') || ''; +const STORED_TOKEN = window.localStorage.getItem('papercrate_token') || ''; if (STORED_TOKEN) { api.defaults.headers.common.Authorization = `Bearer ${STORED_TOKEN}`; } @@ -219,7 +219,7 @@ const DropOverlay = ({ active, folderName }) => ( const LoginView = ({ onSubmit, status }) => (
-

Paperless-NEO

+

Papercrate

Authenticate to manage your documents.

@@ -1501,7 +1501,7 @@ const AppLayout = () => { const routeFolderId = folderMatch?.params?.folderId || nestedDocMatch?.params?.folderId || null; const routeDocumentId = docMatch?.params?.documentId || null; - const [token, setToken] = useState(() => window.localStorage.getItem('paperless_token') || ''); + const [token, setToken] = useState(() => window.localStorage.getItem('papercrate_token') || ''); const [status, setStatus] = useState(null); const setStatusMessage = useCallback((message, variant = 'info') => { setStatus(message ? { message, variant } : null); @@ -1621,10 +1621,10 @@ const AppLayout = () => { useEffect(() => { if (token) { api.defaults.headers.common.Authorization = `Bearer ${token}`; - window.localStorage.setItem('paperless_token', token); + window.localStorage.setItem('papercrate_token', token); } else { delete api.defaults.headers.common.Authorization; - window.localStorage.removeItem('paperless_token'); + window.localStorage.removeItem('papercrate_token'); } }, [token]); @@ -1969,7 +1969,7 @@ const AppLayout = () => { event.dataTransfer.effectAllowed = 'move'; try { event.dataTransfer.setData( - 'application/x-paperless-doc-list', + 'application/x-papercrate-doc-list', JSON.stringify(selection), ); } catch ( @@ -2169,7 +2169,7 @@ const AppLayout = () => { setDraggedFolderId(folderId); event.dataTransfer.effectAllowed = 'move'; try { - event.dataTransfer.setData('application/x-paperless-folder', folderId); + event.dataTransfer.setData('application/x-papercrate-folder', folderId); } catch ( // eslint-disable-next-line no-empty error @@ -3465,8 +3465,8 @@ const AppLayout = () => { let folderSourceId = draggedFolderId; if (!folderSourceId) { try { - if (event.dataTransfer.types?.includes('application/x-paperless-folder')) { - folderSourceId = event.dataTransfer.getData('application/x-paperless-folder'); + if (event.dataTransfer.types?.includes('application/x-papercrate-folder')) { + folderSourceId = event.dataTransfer.getData('application/x-papercrate-folder'); } } catch ( // eslint-disable-next-line no-empty @@ -3494,7 +3494,7 @@ const AppLayout = () => { let docIds = []; try { - const raw = event.dataTransfer.getData('application/x-paperless-doc-list'); + const raw = event.dataTransfer.getData('application/x-papercrate-doc-list'); if (raw) { const parsed = JSON.parse(raw); if (Array.isArray(parsed)) { @@ -3508,7 +3508,7 @@ const AppLayout = () => { if (!docIds.length) { try { - const single = event.dataTransfer.getData('application/x-paperless-doc'); + const single = event.dataTransfer.getData('application/x-papercrate-doc'); if (single) { docIds = [single]; } @@ -3901,7 +3901,7 @@ const AppLayout = () => {
-

Paperless-NEO

+

Papercrate

{previewActive ? 'Viewing document preview. Press ← Back to return to the library.'