rename to papercrate
This commit is contained in:
@@ -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
|
||||
```
|
||||
|
||||
|
||||
Generated
+1
-1
@@ -2108,7 +2108,7 @@ dependencies = [
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "paperless-backend"
|
||||
name = "papercrate-backend"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
[package]
|
||||
name = "paperless-backend"
|
||||
name = "papercrate-backend"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
|
||||
+4
-4
@@ -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"]
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
@@ -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
@@ -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
@@ -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
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
|
||||
|
||||
|
||||
Generated
+2
-2
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
@@ -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.'
|
||||
|
||||
Reference in New Issue
Block a user