rename to papercrate

This commit is contained in:
2025-10-12 02:35:56 +02:00
parent d9a36a99a7
commit dc22b12df3
17 changed files with 62 additions and 62 deletions
+5 -5
View File
@@ -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:<TAG>
image: ghcr.io/example/papercrate-backend:<TAG>
command: ["/usr/local/bin/diesel", "migration", "run"]
env:
- name: DATABASE_URL
valueFrom:
secretKeyRef:
name: paperless-db
name: papercrate-db
key: DATABASE_URL
```
+1 -1
View File
@@ -2108,7 +2108,7 @@ dependencies = [
]
[[package]]
name = "paperless-backend"
name = "papercrate-backend"
version = "0.1.0"
dependencies = [
"anyhow",
+1 -1
View File
@@ -1,5 +1,5 @@
[package]
name = "paperless-backend"
name = "papercrate-backend"
version = "0.1.0"
edition = "2021"
+4 -4
View File
@@ -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"]
+1 -1
View File
@@ -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,
+1 -1
View File
@@ -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,
};
+3 -3
View File
@@ -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()
+7 -7
View File
@@ -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<()> {
+10 -10
View File
@@ -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<Vec<Job>> {
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
+4 -4
View File
@@ -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
+4 -4
View File
@@ -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
+2 -2
View File
@@ -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:
+2 -2
View File
@@ -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
+2 -2
View File
@@ -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",
+2 -2
View File
@@ -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",
+1 -1
View File
@@ -3,7 +3,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Paperless-NEO</title>
<title>Papercrate</title>
</head>
<body>
<main id="app"></main>
+12 -12
View File
@@ -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 }) => (
<div className="login-screen">
<div className="login-card">
<h1>Paperless-NEO</h1>
<h1>Papercrate</h1>
<p>Authenticate to manage your documents.</p>
<form onSubmit={onSubmit}>
<label htmlFor="username">Username</label>
@@ -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 = () => {
<header className="app-bar">
<div className="app-bar__main">
<div className="app-bar__meta">
<h1>Paperless-NEO</h1>
<h1>Papercrate</h1>
<span className="app-bar__hint">
{previewActive
? 'Viewing document preview. Press ← Back to return to the library.'