diff options
| author | Benedikt Peetz <benedikt.peetz@b-peetz.de> | 2026-06-11 00:54:30 +0200 |
|---|---|---|
| committer | Benedikt Peetz <benedikt.peetz@b-peetz.de> | 2026-06-11 00:54:30 +0200 |
| commit | 5c39e7cf284a1f6e9a1657f2deb44e359fc47eb8 (patch) | |
| tree | c64baa8d5866c8e339eaf660dd3f94f30a3f7d8a /crates/atuin-server | |
| parent | chore: Somewhat simplify sync code (diff) | |
| download | atuin-5c39e7cf284a1f6e9a1657f2deb44e359fc47eb8.zip | |
chore: Move everything into one big crate
That helps remove duplicated code and rustc/cargo will now also show
dead code correctly.
Diffstat (limited to '')
58 files changed, 63 insertions, 599 deletions
diff --git a/crates/atuin-server-database/Cargo.toml b/crates/atuin-server-database/Cargo.toml deleted file mode 100644 index 52ccbf97..00000000 --- a/crates/atuin-server-database/Cargo.toml +++ /dev/null @@ -1,21 +0,0 @@ -[package] -name = "atuin-server-database" -edition = "2024" -description = "server database library for atuin" - -version = { workspace = true } -authors = { workspace = true } -license = { workspace = true } -homepage = { workspace = true } -repository = { workspace = true } - -[dependencies] -atuin-common = { path = "../atuin-common", version = "18.16.1" } - -async-trait = { workspace = true } -eyre = { workspace = true } -serde = { workspace = true } -sqlx = { workspace = true } -time = { workspace = true } -tracing = { workspace = true } -url = "2.5.2" diff --git a/crates/atuin-server-postgres/Cargo.toml b/crates/atuin-server-postgres/Cargo.toml deleted file mode 100644 index ea19899e..00000000 --- a/crates/atuin-server-postgres/Cargo.toml +++ /dev/null @@ -1,25 +0,0 @@ -[package] -name = "atuin-server-postgres" -edition = "2024" -description = "server postgres database library for atuin" - -version = { workspace = true } -authors = { workspace = true } -license = { workspace = true } -homepage = { workspace = true } -repository = { workspace = true } - -[dependencies] -atuin-common = { path = "../atuin-common", version = "18.16.1" } -atuin-server-database = { path = "../atuin-server-database", version = "18.16.1" } - -eyre = { workspace = true } -tracing = { workspace = true } -time = { workspace = true } -serde = { workspace = true } -sqlx = { workspace = true } -async-trait = { workspace = true } -uuid = { workspace = true } -metrics = "0.24" -futures-util = "0.3" -rand.workspace = true
\ No newline at end of file diff --git a/crates/atuin-server-postgres/build.rs b/crates/atuin-server-postgres/build.rs deleted file mode 100644 index d5068697..00000000 --- a/crates/atuin-server-postgres/build.rs +++ /dev/null @@ -1,5 +0,0 @@ -// generated by `sqlx migrate build-script` -fn main() { - // trigger recompilation when a new migration is added - println!("cargo:rerun-if-changed=migrations"); -} diff --git a/crates/atuin-server-postgres/migrations/20210425153745_create_history.sql b/crates/atuin-server-postgres/migrations/20210425153745_create_history.sql deleted file mode 100644 index 2c2d17b0..00000000 --- a/crates/atuin-server-postgres/migrations/20210425153745_create_history.sql +++ /dev/null @@ -1,11 +0,0 @@ -create table history ( - id bigserial primary key, - client_id text not null unique, -- the client-generated ID - user_id bigserial not null, -- allow multiple users - hostname text not null, -- a unique identifier from the client (can be hashed, random, whatever) - timestamp timestamp not null, -- one of the few non-encrypted metadatas - - data varchar(8192) not null, -- store the actual history data, encrypted. I don't wanna know! - - created_at timestamp not null default current_timestamp -); diff --git a/crates/atuin-server-postgres/migrations/20210425153757_create_users.sql b/crates/atuin-server-postgres/migrations/20210425153757_create_users.sql deleted file mode 100644 index a25dcced..00000000 --- a/crates/atuin-server-postgres/migrations/20210425153757_create_users.sql +++ /dev/null @@ -1,10 +0,0 @@ -create table users ( - id bigserial primary key, -- also store our own ID - username varchar(32) not null unique, -- being able to contact users is useful - email varchar(128) not null unique, -- being able to contact users is useful - password varchar(128) not null unique -); - --- the prior index is case sensitive :( -CREATE UNIQUE INDEX email_unique_idx on users (LOWER(email)); -CREATE UNIQUE INDEX username_unique_idx on users (LOWER(username)); diff --git a/crates/atuin-server-postgres/migrations/20210425153800_create_sessions.sql b/crates/atuin-server-postgres/migrations/20210425153800_create_sessions.sql deleted file mode 100644 index c2fb6559..00000000 --- a/crates/atuin-server-postgres/migrations/20210425153800_create_sessions.sql +++ /dev/null @@ -1,6 +0,0 @@ --- Add migration script here -create table sessions ( - id bigserial primary key, - user_id bigserial, - token varchar(128) unique not null -); diff --git a/crates/atuin-server-postgres/migrations/20220419082412_add_count_trigger.sql b/crates/atuin-server-postgres/migrations/20220419082412_add_count_trigger.sql deleted file mode 100644 index dd1afa88..00000000 --- a/crates/atuin-server-postgres/migrations/20220419082412_add_count_trigger.sql +++ /dev/null @@ -1,51 +0,0 @@ --- Prior to this, the count endpoint was super naive and just ran COUNT(1). --- This is slow asf. Now that we have an amount of actual traffic, --- stop doing that! --- This basically maintains a count, so we can read ONE row, instead of ALL the --- rows. Much better. --- Future optimisation could use some sort of cache so we don't even need to hit --- postgres at all. - -create table total_history_count_user( - id bigserial primary key, - user_id bigserial, - total integer -- try and avoid using keywords - hence total, not count -); - -create or replace function user_history_count() -returns trigger as -$func$ -begin - if (TG_OP='INSERT') then - update total_history_count_user set total = total + 1 where user_id = new.user_id; - - if not found then - insert into total_history_count_user(user_id, total) - values ( - new.user_id, - (select count(1) from history where user_id = new.user_id) - ); - end if; - - elsif (TG_OP='DELETE') then - update total_history_count_user set total = total - 1 where user_id = new.user_id; - - if not found then - insert into total_history_count_user(user_id, total) - values ( - new.user_id, - (select count(1) from history where user_id = new.user_id) - ); - end if; - end if; - - return NEW; -- this is actually ignored for an after trigger, but oh well -end; -$func$ -language plpgsql volatile -- pldfplplpflh -cost 100; -- default value - -create trigger tg_user_history_count - after insert or delete on history - for each row - execute procedure user_history_count(); diff --git a/crates/atuin-server-postgres/migrations/20220421073605_fix_count_trigger_delete.sql b/crates/atuin-server-postgres/migrations/20220421073605_fix_count_trigger_delete.sql deleted file mode 100644 index 6198f300..00000000 --- a/crates/atuin-server-postgres/migrations/20220421073605_fix_count_trigger_delete.sql +++ /dev/null @@ -1,35 +0,0 @@ --- the old version of this function used NEW in the delete part when it should --- use OLD - -create or replace function user_history_count() -returns trigger as -$func$ -begin - if (TG_OP='INSERT') then - update total_history_count_user set total = total + 1 where user_id = new.user_id; - - if not found then - insert into total_history_count_user(user_id, total) - values ( - new.user_id, - (select count(1) from history where user_id = new.user_id) - ); - end if; - - elsif (TG_OP='DELETE') then - update total_history_count_user set total = total - 1 where user_id = old.user_id; - - if not found then - insert into total_history_count_user(user_id, total) - values ( - old.user_id, - (select count(1) from history where user_id = old.user_id) - ); - end if; - end if; - - return NEW; -- this is actually ignored for an after trigger, but oh well -end; -$func$ -language plpgsql volatile -- pldfplplpflh -cost 100; -- default value diff --git a/crates/atuin-server-postgres/migrations/20220421174016_larger-commands.sql b/crates/atuin-server-postgres/migrations/20220421174016_larger-commands.sql deleted file mode 100644 index 0ac43433..00000000 --- a/crates/atuin-server-postgres/migrations/20220421174016_larger-commands.sql +++ /dev/null @@ -1,3 +0,0 @@ --- Make it 4x larger. Most commands are less than this, but as it's base64 --- SOME are more than 8192. Should be enough for now. -ALTER TABLE history ALTER COLUMN data TYPE varchar(32768); diff --git a/crates/atuin-server-postgres/migrations/20220426172813_user-created-at.sql b/crates/atuin-server-postgres/migrations/20220426172813_user-created-at.sql deleted file mode 100644 index a9138194..00000000 --- a/crates/atuin-server-postgres/migrations/20220426172813_user-created-at.sql +++ /dev/null @@ -1 +0,0 @@ -alter table users add column created_at timestamp not null default now(); diff --git a/crates/atuin-server-postgres/migrations/20220505082442_create-events.sql b/crates/atuin-server-postgres/migrations/20220505082442_create-events.sql deleted file mode 100644 index 57e16ec7..00000000 --- a/crates/atuin-server-postgres/migrations/20220505082442_create-events.sql +++ /dev/null @@ -1,14 +0,0 @@ -create type event_type as enum ('create', 'delete'); - -create table events ( - id bigserial primary key, - client_id text not null unique, -- the client-generated ID - user_id bigserial not null, -- allow multiple users - hostname text not null, -- a unique identifier from the client (can be hashed, random, whatever) - timestamp timestamp not null, -- one of the few non-encrypted metadatas - - event_type event_type, - data text not null, -- store the actual history data, encrypted. I don't wanna know! - - created_at timestamp not null default current_timestamp -); diff --git a/crates/atuin-server-postgres/migrations/20220610074049_history-length.sql b/crates/atuin-server-postgres/migrations/20220610074049_history-length.sql deleted file mode 100644 index b1c23016..00000000 --- a/crates/atuin-server-postgres/migrations/20220610074049_history-length.sql +++ /dev/null @@ -1,2 +0,0 @@ --- Add migration script here -alter table history alter column data type text; diff --git a/crates/atuin-server-postgres/migrations/20230315220537_drop-events.sql b/crates/atuin-server-postgres/migrations/20230315220537_drop-events.sql deleted file mode 100644 index fe3cae17..00000000 --- a/crates/atuin-server-postgres/migrations/20230315220537_drop-events.sql +++ /dev/null @@ -1,2 +0,0 @@ --- Add migration script here -drop table events; diff --git a/crates/atuin-server-postgres/migrations/20230315224203_create-deleted.sql b/crates/atuin-server-postgres/migrations/20230315224203_create-deleted.sql deleted file mode 100644 index 9a9e6263..00000000 --- a/crates/atuin-server-postgres/migrations/20230315224203_create-deleted.sql +++ /dev/null @@ -1,5 +0,0 @@ --- Add migration script here -alter table history add column if not exists deleted_at timestamp; - --- queries will all be selecting the ids of history for a user, that has been deleted -create index if not exists history_deleted_index on history(client_id, user_id, deleted_at); diff --git a/crates/atuin-server-postgres/migrations/20230515221038_trigger-delete-only.sql b/crates/atuin-server-postgres/migrations/20230515221038_trigger-delete-only.sql deleted file mode 100644 index 3d0bba52..00000000 --- a/crates/atuin-server-postgres/migrations/20230515221038_trigger-delete-only.sql +++ /dev/null @@ -1,30 +0,0 @@ --- We do not need to run the trigger on deletes, as the only time we are deleting history is when the user --- has already been deleted --- This actually slows down deleting all the history a good bit! - -create or replace function user_history_count() -returns trigger as -$func$ -begin - if (TG_OP='INSERT') then - update total_history_count_user set total = total + 1 where user_id = new.user_id; - - if not found then - insert into total_history_count_user(user_id, total) - values ( - new.user_id, - (select count(1) from history where user_id = new.user_id) - ); - end if; - end if; - - return NEW; -- this is actually ignored for an after trigger, but oh well -end; -$func$ -language plpgsql volatile -- pldfplplpflh -cost 100; -- default value - -create or replace trigger tg_user_history_count - after insert on history - for each row - execute procedure user_history_count(); diff --git a/crates/atuin-server-postgres/migrations/20230623070418_records.sql b/crates/atuin-server-postgres/migrations/20230623070418_records.sql deleted file mode 100644 index 22437595..00000000 --- a/crates/atuin-server-postgres/migrations/20230623070418_records.sql +++ /dev/null @@ -1,15 +0,0 @@ --- Add migration script here -create table records ( - id uuid primary key, -- remember to use uuidv7 for happy indices <3 - client_id uuid not null, -- I am too uncomfortable with the idea of a client-generated primary key - host uuid not null, -- a unique identifier for the host - parent uuid default null, -- the ID of the parent record, bearing in mind this is a linked list - timestamp bigint not null, -- not a timestamp type, as those do not have nanosecond precision - version text not null, - tag text not null, -- what is this? history, kv, whatever. Remember clients get a log per tag per host - data text not null, -- store the actual history data, encrypted. I don't wanna know! - cek text not null, - - user_id bigint not null, -- allow multiple users - created_at timestamp not null default current_timestamp -); diff --git a/crates/atuin-server-postgres/migrations/20231202170508_create-store.sql b/crates/atuin-server-postgres/migrations/20231202170508_create-store.sql deleted file mode 100644 index ffb57966..00000000 --- a/crates/atuin-server-postgres/migrations/20231202170508_create-store.sql +++ /dev/null @@ -1,15 +0,0 @@ --- Add migration script here -create table store ( - id uuid primary key, -- remember to use uuidv7 for happy indices <3 - client_id uuid not null, -- I am too uncomfortable with the idea of a client-generated primary key, even though it's fine mathematically - host uuid not null, -- a unique identifier for the host - idx bigint not null, -- the index of the record in this store, identified by (host, tag) - timestamp bigint not null, -- not a timestamp type, as those do not have nanosecond precision - version text not null, - tag text not null, -- what is this? history, kv, whatever. Remember clients get a log per tag per host - data text not null, -- store the actual history data, encrypted. I don't wanna know! - cek text not null, - - user_id bigint not null, -- allow multiple users - created_at timestamp not null default current_timestamp -); diff --git a/crates/atuin-server-postgres/migrations/20231203124112_create-store-idx.sql b/crates/atuin-server-postgres/migrations/20231203124112_create-store-idx.sql deleted file mode 100644 index 56d67145..00000000 --- a/crates/atuin-server-postgres/migrations/20231203124112_create-store-idx.sql +++ /dev/null @@ -1,2 +0,0 @@ --- Add migration script here -create unique index record_uniq ON store(user_id, host, tag, idx); diff --git a/crates/atuin-server-postgres/migrations/20240108124837_drop-some-defaults.sql b/crates/atuin-server-postgres/migrations/20240108124837_drop-some-defaults.sql deleted file mode 100644 index ad2af5a1..00000000 --- a/crates/atuin-server-postgres/migrations/20240108124837_drop-some-defaults.sql +++ /dev/null @@ -1,4 +0,0 @@ --- Add migration script here -alter table history alter column user_id drop default; -alter table sessions alter column user_id drop default; -alter table total_history_count_user alter column user_id drop default; diff --git a/crates/atuin-server-postgres/migrations/20240614104159_idx-cache.sql b/crates/atuin-server-postgres/migrations/20240614104159_idx-cache.sql deleted file mode 100644 index 76425ed7..00000000 --- a/crates/atuin-server-postgres/migrations/20240614104159_idx-cache.sql +++ /dev/null @@ -1,8 +0,0 @@ -create table store_idx_cache( - id bigserial primary key, - user_id bigint, - - host uuid, - tag text, - idx bigint -); diff --git a/crates/atuin-server-postgres/migrations/20240621110731_user-verified.sql b/crates/atuin-server-postgres/migrations/20240621110731_user-verified.sql deleted file mode 100644 index 6eba02ec..00000000 --- a/crates/atuin-server-postgres/migrations/20240621110731_user-verified.sql +++ /dev/null @@ -1,8 +0,0 @@ -alter table users add verified_at timestamp with time zone default null; - -create table user_verification_token( - id bigserial primary key, - user_id bigint unique references users(id), - token text, - valid_until timestamp with time zone -); diff --git a/crates/atuin-server-postgres/migrations/20240702094825_idx_cache_index.sql b/crates/atuin-server-postgres/migrations/20240702094825_idx_cache_index.sql deleted file mode 100644 index d1a7b194..00000000 --- a/crates/atuin-server-postgres/migrations/20240702094825_idx_cache_index.sql +++ /dev/null @@ -1 +0,0 @@ -create unique index store_idx_cache_uniq on store_idx_cache(user_id, host, tag); diff --git a/crates/atuin-server-postgres/migrations/20260127000000_remove-email-verification.sql b/crates/atuin-server-postgres/migrations/20260127000000_remove-email-verification.sql deleted file mode 100644 index 15309920..00000000 --- a/crates/atuin-server-postgres/migrations/20260127000000_remove-email-verification.sql +++ /dev/null @@ -1,2 +0,0 @@ -drop table if exists user_verification_token; -alter table users drop column if exists verified_at; diff --git a/crates/atuin-server-sqlite/Cargo.toml b/crates/atuin-server-sqlite/Cargo.toml deleted file mode 100644 index 579a5e7e..00000000 --- a/crates/atuin-server-sqlite/Cargo.toml +++ /dev/null @@ -1,24 +0,0 @@ -[package] -name = "atuin-server-sqlite" -edition = "2024" -description = "server sqlite database library for atuin" - -version = { workspace = true } -authors = { workspace = true } -license = { workspace = true } -homepage = { workspace = true } -repository = { workspace = true } - -[dependencies] -atuin-common = { path = "../atuin-common", version = "18.16.1" } -atuin-server-database = { path = "../atuin-server-database", version = "18.16.1" } - -eyre = { workspace = true } -tracing = { workspace = true } -time = { workspace = true } -serde = { workspace = true } -sqlx = { workspace = true, features = ["sqlite", "regexp"] } -async-trait = { workspace = true } -uuid = { workspace = true } -metrics = "0.24" -futures-util = "0.3" diff --git a/crates/atuin-server-sqlite/build.rs b/crates/atuin-server-sqlite/build.rs deleted file mode 100644 index d5068697..00000000 --- a/crates/atuin-server-sqlite/build.rs +++ /dev/null @@ -1,5 +0,0 @@ -// generated by `sqlx migrate build-script` -fn main() { - // trigger recompilation when a new migration is added - println!("cargo:rerun-if-changed=migrations"); -} diff --git a/crates/atuin-server-sqlite/migrations/20231203124112_create-store.sql b/crates/atuin-server-sqlite/migrations/20231203124112_create-store.sql deleted file mode 100644 index ca19ed62..00000000 --- a/crates/atuin-server-sqlite/migrations/20231203124112_create-store.sql +++ /dev/null @@ -1,17 +0,0 @@ -create table store ( - id text primary key, -- remember to use uuidv7 for happy indices <3 - client_id text not null, -- I am too uncomfortable with the idea of a client-generated primary key, even though it's fine mathematically - host text not null, -- a unique identifier for the host - idx bigint not null, -- the index of the record in this store, identified by (host, tag) - timestamp bigint not null, -- not a timestamp type, as those do not have nanosecond precision - version text not null, - tag text not null, -- what is this? history, kv, whatever. Remember clients get a log per tag per host - data text not null, -- store the actual history data, encrypted. I don't wanna know! - cek text not null, - - user_id bigint not null, -- allow multiple users - created_at timestamp not null default current_timestamp -); - -create unique index record_uniq ON store(user_id, host, tag, idx); - diff --git a/crates/atuin-server-sqlite/migrations/20240108124830_create-history.sql b/crates/atuin-server-sqlite/migrations/20240108124830_create-history.sql deleted file mode 100644 index 7bd653ba..00000000 --- a/crates/atuin-server-sqlite/migrations/20240108124830_create-history.sql +++ /dev/null @@ -1,15 +0,0 @@ -create table history ( - id integer primary key autoincrement, - client_id text not null unique, -- the client-generated ID - user_id bigserial not null, -- allow multiple users - hostname text not null, -- a unique identifier from the client (can be hashed, random, whatever) - timestamp timestamp not null, -- one of the few non-encrypted metadatas - - data text not null, -- store the actual history data, encrypted. I don't wanna know! - - created_at timestamp not null default current_timestamp, - deleted_at timestamp -); - -create unique index history_deleted_index on history(client_id, user_id, deleted_at); - diff --git a/crates/atuin-server-sqlite/migrations/20240108124831_create-sessions.sql b/crates/atuin-server-sqlite/migrations/20240108124831_create-sessions.sql deleted file mode 100644 index 3120c35d..00000000 --- a/crates/atuin-server-sqlite/migrations/20240108124831_create-sessions.sql +++ /dev/null @@ -1,6 +0,0 @@ -create table sessions ( - id integer primary key autoincrement, - user_id integer, - token text unique not null -); - diff --git a/crates/atuin-server-sqlite/migrations/20240621110730_create-users.sql b/crates/atuin-server-sqlite/migrations/20240621110730_create-users.sql deleted file mode 100644 index 852c159d..00000000 --- a/crates/atuin-server-sqlite/migrations/20240621110730_create-users.sql +++ /dev/null @@ -1,12 +0,0 @@ -create table users ( - id integer primary key autoincrement, -- also store our own ID - username text not null unique, -- being able to contact users is useful - email text not null unique, -- being able to contact users is useful - password text not null unique, - created_at timestamp not null default (datetime('now','localtime')), - verified_at timestamp with time zone default null -); - --- the prior index is case sensitive :( -CREATE UNIQUE INDEX email_unique_idx on users (LOWER(email)); -CREATE UNIQUE INDEX username_unique_idx on users (LOWER(username)); diff --git a/crates/atuin-server-sqlite/migrations/20240621110731_create-user-verification-token.sql b/crates/atuin-server-sqlite/migrations/20240621110731_create-user-verification-token.sql deleted file mode 100644 index 36eb14de..00000000 --- a/crates/atuin-server-sqlite/migrations/20240621110731_create-user-verification-token.sql +++ /dev/null @@ -1,6 +0,0 @@ -create table user_verification_token( - id integer primary key autoincrement, - user_id bigint unique references users(id), - token text, - valid_until timestamp with time zone -); diff --git a/crates/atuin-server-sqlite/migrations/20240702094825_create-store-idx-cache.sql b/crates/atuin-server-sqlite/migrations/20240702094825_create-store-idx-cache.sql deleted file mode 100644 index cd54cb18..00000000 --- a/crates/atuin-server-sqlite/migrations/20240702094825_create-store-idx-cache.sql +++ /dev/null @@ -1,10 +0,0 @@ -create table store_idx_cache( - id integer primary key autoincrement, - user_id bigint, - - host uuid, - tag text, - idx bigint -); - -create unique index store_idx_cache_uniq on store_idx_cache(user_id, host, tag); diff --git a/crates/atuin-server-sqlite/migrations/20260127000000_remove-email-verification.sql b/crates/atuin-server-sqlite/migrations/20260127000000_remove-email-verification.sql deleted file mode 100644 index 0bde89d7..00000000 --- a/crates/atuin-server-sqlite/migrations/20260127000000_remove-email-verification.sql +++ /dev/null @@ -1,2 +0,0 @@ -drop table if exists user_verification_token; -alter table users drop column verified_at; diff --git a/crates/atuin-server/CHANGELOG.md b/crates/atuin-server/CHANGELOG.md deleted file mode 120000 index 699cc9e7..00000000 --- a/crates/atuin-server/CHANGELOG.md +++ /dev/null @@ -1 +0,0 @@ -../../CHANGELOG.md
\ No newline at end of file diff --git a/crates/atuin-server/Cargo.toml b/crates/atuin-server/Cargo.toml deleted file mode 100644 index b7779899..00000000 --- a/crates/atuin-server/Cargo.toml +++ /dev/null @@ -1,45 +0,0 @@ -[package] -name = "atuin-server" -edition = "2024" -description = "server library for atuin" - -rust-version = { workspace = true } -version = { workspace = true } -authors = { workspace = true } -license = { workspace = true } -homepage = { workspace = true } -repository = { workspace = true } - -[lib] -name = "atuin_server" -path = "src/lib.rs" - -[[bin]] -name = "atuin-server" -path = "src/bin/main.rs" - -[dependencies] -atuin-common = { workspace = true } -atuin-server-database = { workspace = true } -atuin-server-postgres = { workspace = true } -atuin-server-sqlite = { workspace = true } - -tracing = { workspace = true } -time = { workspace = true } -eyre = { workspace = true } -config = { workspace = true } -serde = { workspace = true } -serde_json = { workspace = true } -rand = { workspace = true } -tokio = { workspace = true } -axum = "0.8" -fs-err = { workspace = true } -tower = { workspace = true } -tower-http = { version = "0.6", features = ["trace"] } -reqwest = { workspace = true } -argon2 = "0.5" -semver = { workspace = true } -metrics-exporter-prometheus = { version = "0.18", default-features = false } -metrics = "0.24" -clap = { workspace = true } -tracing-subscriber = { workspace = true } diff --git a/crates/atuin-server/server.toml b/crates/atuin-server/server.toml deleted file mode 100644 index 9ff95890..00000000 --- a/crates/atuin-server/server.toml +++ /dev/null @@ -1,38 +0,0 @@ -## host to bind, can also be passed via CLI args -# host = "127.0.0.1" - -## port to bind, can also be passed via CLI args -# port = 8888 - -## whether to allow anyone to register an account -# open_registration = false - -## URI for postgres (using development creds here) -# db_uri="postgres://username:password@localhost/atuin" -# db_uri="sqlite:///config/atuin-server.db" - -## Optional: URI for read replica database -## If set, read-only queries will be routed to this database -# read_db_uri="postgres://username:password@localhost-replica/atuin" - -## Maximum size for one history entry -# max_history_length = 8192 - -## Maximum size for one record entry -## 1024 * 1024 * 1024 -# max_record_size = 1073741824 - -## Webhook to be called when user registers on the servers -# register_webhook_username = "" - -## Default page size for requests -# page_size = 1100 - -# [metrics] -# enable = false -# host = 127.0.0.1 -# port = 9001 - -## Enable legacy sync v1 routes (history-based sync) -## Set to false to disable and use only the newer record-based sync -# sync_v1_enabled = true diff --git a/crates/atuin-server/src/bin/main.rs b/crates/atuin-server/src/bin/main.rs deleted file mode 100644 index 960bdf6e..00000000 --- a/crates/atuin-server/src/bin/main.rs +++ /dev/null @@ -1,73 +0,0 @@ -#![forbid(unsafe_code)] - -use std::net::SocketAddr; - -use atuin_server::{Settings, example_config, launch, launch_metrics_server}; -use atuin_server_database::DbType; -use atuin_server_postgres::Postgres; -use atuin_server_sqlite::Sqlite; - -use clap::Parser; -use eyre::{Context, Result, eyre}; -use tracing_subscriber::{EnvFilter, fmt, prelude::*}; - -#[derive(Parser, Debug)] -#[clap( - name = "atuin-server", - about = "Atuin sync server", - version, - infer_subcommands = true -)] -enum Cmd { - /// Start the server - Start { - /// The host address to bind - #[clap(long)] - host: Option<String>, - - /// The port to bind - #[clap(long, short)] - port: Option<u16>, - }, - - /// Print server example configuration - DefaultConfig, -} - -#[tokio::main] -async fn main() -> Result<()> { - let cmd = Cmd::parse(); - - tracing_subscriber::registry() - .with(fmt::layer()) - .with(EnvFilter::from_default_env()) - .init(); - - tracing::trace!(command = ?cmd, "server command"); - - match cmd { - Cmd::Start { host, port } => { - let settings = Settings::new().wrap_err("could not load server settings")?; - let host = host.as_ref().unwrap_or(&settings.host).clone(); - let port = port.unwrap_or(settings.port); - let addr = SocketAddr::new(host.parse()?, port); - - if settings.metrics.enable { - tokio::spawn(launch_metrics_server( - settings.metrics.host.clone(), - settings.metrics.port, - )); - } - - match settings.db_settings.db_type() { - DbType::Postgres => launch::<Postgres>(settings, addr).await, - DbType::Sqlite => launch::<Sqlite>(settings, addr).await, - DbType::Unknown => Err(eyre!("db_uri must start with postgres:// or sqlite://")), - } - } - Cmd::DefaultConfig => { - println!("{}", example_config()); - Ok(()) - } - } -} diff --git a/crates/atuin-server/src/handlers/health.rs b/crates/turtle/src/atuin_server/handlers/health.rs index aebd1e8f..aebd1e8f 100644 --- a/crates/atuin-server/src/handlers/health.rs +++ b/crates/turtle/src/atuin_server/handlers/health.rs diff --git a/crates/atuin-server/src/handlers/history.rs b/crates/turtle/src/atuin_server/handlers/history.rs index bdafcc60..7f09161b 100644 --- a/crates/atuin-server/src/handlers/history.rs +++ b/crates/turtle/src/atuin_server/handlers/history.rs @@ -10,17 +10,17 @@ use time::{Month, UtcOffset}; use tracing::{debug, error, instrument}; use super::{ErrorResponse, ErrorResponseStatus, RespExt}; -use crate::{ +use crate::atuin_server::{ router::{AppState, UserAuth}, utils::client_version_min, }; -use atuin_server_database::{ +use crate::atuin_server_database::{ Database, calendar::{TimePeriod, TimePeriodInfo}, models::NewHistory, }; -use atuin_common::api::*; +use crate::atuin_common::api::*; #[instrument(skip_all, fields(user.id = user.id))] pub async fn count<DB: Database>( diff --git a/crates/atuin-server/src/handlers/mod.rs b/crates/turtle/src/atuin_server/handlers/mod.rs index 2176ac5e..7722d03e 100644 --- a/crates/atuin-server/src/handlers/mod.rs +++ b/crates/turtle/src/atuin_server/handlers/mod.rs @@ -1,8 +1,8 @@ -use atuin_common::api::{ErrorResponse, IndexResponse}; -use atuin_server_database::Database; +use crate::atuin_common::api::{ErrorResponse, IndexResponse}; +use crate::atuin_server_database::Database; use axum::{Json, extract::State, http, response::IntoResponse}; -use crate::router::AppState; +use crate::atuin_server::router::AppState; pub mod health; pub mod history; diff --git a/crates/atuin-server/src/handlers/record.rs b/crates/turtle/src/atuin_server/handlers/record.rs index 410c54bd..63325606 100644 --- a/crates/atuin-server/src/handlers/record.rs +++ b/crates/turtle/src/atuin_server/handlers/record.rs @@ -3,9 +3,9 @@ use serde_json::json; use tracing::instrument; use super::{ErrorResponse, ErrorResponseStatus, RespExt}; -use crate::router::UserAuth; +use crate::atuin_server::router::UserAuth; -use atuin_common::record::{EncryptedData, Record}; +use crate::atuin_common::record::{EncryptedData, Record}; #[instrument(skip_all, fields(user.id = user.id))] pub async fn post(UserAuth(user): UserAuth) -> Result<(), ErrorResponseStatus<'static>> { diff --git a/crates/atuin-server/src/handlers/status.rs b/crates/turtle/src/atuin_server/handlers/status.rs index 9c152d51..0cf2ca1e 100644 --- a/crates/atuin-server/src/handlers/status.rs +++ b/crates/turtle/src/atuin_server/handlers/status.rs @@ -2,10 +2,10 @@ use axum::{Json, extract::State, http::StatusCode}; use tracing::instrument; use super::{ErrorResponse, ErrorResponseStatus, RespExt}; -use crate::router::{AppState, UserAuth}; -use atuin_server_database::Database; +use crate::atuin_server::router::{AppState, UserAuth}; +use crate::atuin_server_database::Database; -use atuin_common::api::*; +use crate::atuin_common::api::*; const VERSION: &str = env!("CARGO_PKG_VERSION"); diff --git a/crates/atuin-server/src/handlers/user.rs b/crates/turtle/src/atuin_server/handlers/user.rs index dda7a381..01b72202 100644 --- a/crates/atuin-server/src/handlers/user.rs +++ b/crates/turtle/src/atuin_server/handlers/user.rs @@ -16,18 +16,18 @@ use metrics::counter; use rand::rngs::OsRng; use tracing::{debug, error, info, instrument}; -use atuin_common::tls::ensure_crypto_provider; +use crate::atuin_common::tls::ensure_crypto_provider; use super::{ErrorResponse, ErrorResponseStatus, RespExt}; -use crate::router::{AppState, UserAuth}; -use atuin_server_database::{ +use crate::atuin_server::router::{AppState, UserAuth}; +use crate::atuin_server_database::{ Database, DbError, models::{NewSession, NewUser}, }; use reqwest::header::CONTENT_TYPE; -use atuin_common::{api::*, utils::crypto_random_string}; +use crate::atuin_common::{api::*, utils::crypto_random_string}; pub fn verify_str(hash: &str, password: &str) -> bool { let arg2 = Argon2::new(Algorithm::Argon2id, Version::V0x13, Params::default()); diff --git a/crates/atuin-server/src/handlers/v0/me.rs b/crates/turtle/src/atuin_server/handlers/v0/me.rs index 7960b479..a1e2db46 100644 --- a/crates/atuin-server/src/handlers/v0/me.rs +++ b/crates/turtle/src/atuin_server/handlers/v0/me.rs @@ -1,10 +1,10 @@ use axum::Json; use tracing::instrument; -use crate::handlers::ErrorResponseStatus; -use crate::router::UserAuth; +use crate::atuin_server::handlers::ErrorResponseStatus; +use crate::atuin_server::router::UserAuth; -use atuin_common::api::*; +use crate::atuin_common::api::*; #[instrument(skip_all, fields(user.id = user.id))] pub async fn get( diff --git a/crates/atuin-server/src/handlers/v0/mod.rs b/crates/turtle/src/atuin_server/handlers/v0/mod.rs index d6f880f2..d6f880f2 100644 --- a/crates/atuin-server/src/handlers/v0/mod.rs +++ b/crates/turtle/src/atuin_server/handlers/v0/mod.rs diff --git a/crates/atuin-server/src/handlers/v0/record.rs b/crates/turtle/src/atuin_server/handlers/v0/record.rs index 5c57910b..9b147a52 100644 --- a/crates/atuin-server/src/handlers/v0/record.rs +++ b/crates/turtle/src/atuin_server/handlers/v0/record.rs @@ -3,13 +3,13 @@ use metrics::counter; use serde::Deserialize; use tracing::{error, instrument}; -use crate::{ +use crate::atuin_server::{ handlers::{ErrorResponse, ErrorResponseStatus, RespExt}, router::{AppState, UserAuth}, }; -use atuin_server_database::Database; +use crate::atuin_server_database::Database; -use atuin_common::record::{EncryptedData, HostId, Record, RecordIdx, RecordStatus}; +use crate::atuin_common::record::{EncryptedData, HostId, Record, RecordIdx, RecordStatus}; #[instrument(skip_all, fields(user.id = user.id))] pub async fn post<DB: Database>( diff --git a/crates/atuin-server/src/handlers/v0/store.rs b/crates/turtle/src/atuin_server/handlers/v0/store.rs index 6ca455d7..cd184546 100644 --- a/crates/atuin-server/src/handlers/v0/store.rs +++ b/crates/turtle/src/atuin_server/handlers/v0/store.rs @@ -3,11 +3,11 @@ use metrics::counter; use serde::Deserialize; use tracing::{error, instrument}; -use crate::{ +use crate::atuin_server::{ handlers::{ErrorResponse, ErrorResponseStatus, RespExt}, router::{AppState, UserAuth}, }; -use atuin_server_database::Database; +use crate::atuin_server_database::Database; #[derive(Deserialize)] pub struct DeleteParams {} diff --git a/crates/atuin-server/src/metrics.rs b/crates/turtle/src/atuin_server/metrics.rs index ebd0dd2d..ebd0dd2d 100644 --- a/crates/atuin-server/src/metrics.rs +++ b/crates/turtle/src/atuin_server/metrics.rs diff --git a/crates/atuin-server/src/lib.rs b/crates/turtle/src/atuin_server/mod.rs index 02e50e1e..bd0f2168 100644 --- a/crates/atuin-server/src/lib.rs +++ b/crates/turtle/src/atuin_server/mod.rs @@ -1,9 +1,7 @@ -#![forbid(unsafe_code)] - use std::future::Future; use std::net::SocketAddr; -use atuin_server_database::Database; +use crate::atuin_server_database::Database; use axum::{Router, serve}; use eyre::{Context, Result}; @@ -13,7 +11,6 @@ mod router; mod utils; pub use settings::Settings; -pub use settings::example_config; pub mod settings; diff --git a/crates/atuin-server/src/router.rs b/crates/turtle/src/atuin_server/router.rs index 2d679759..11a16148 100644 --- a/crates/atuin-server/src/router.rs +++ b/crates/turtle/src/atuin_server/router.rs @@ -1,4 +1,4 @@ -use atuin_common::api::{ATUIN_CARGO_VERSION, ATUIN_HEADER_VERSION, ErrorResponse}; +use crate::atuin_common::api::{ATUIN_CARGO_VERSION, ATUIN_HEADER_VERSION, ErrorResponse}; use axum::{ Router, extract::{FromRequestParts, Request}, @@ -12,12 +12,12 @@ use tower::ServiceBuilder; use tower_http::trace::TraceLayer; use super::handlers; -use crate::{ +use crate::atuin_server::{ handlers::{ErrorResponseStatus, RespExt}, metrics, settings::Settings, }; -use atuin_server_database::{Database, DbError, models::User}; +use crate::atuin_server_database::{Database, DbError, models::User}; pub struct UserAuth(pub User); diff --git a/crates/atuin-server/src/settings.rs b/crates/turtle/src/atuin_server/settings.rs index 3a612be9..f6650af0 100644 --- a/crates/atuin-server/src/settings.rs +++ b/crates/turtle/src/atuin_server/settings.rs @@ -1,13 +1,11 @@ use std::{io::prelude::*, path::PathBuf}; -use atuin_server_database::DbSettings; +use crate::atuin_server_database::DbSettings; use config::{Config, Environment, File as ConfigFile, FileFormat}; use eyre::{Result, eyre}; use fs_err::{File, create_dir_all}; use serde::{Deserialize, Serialize}; -static EXAMPLE_CONFIG: &str = include_str!("../server.toml"); - #[derive(Clone, Debug, Deserialize, Serialize)] pub struct Metrics { #[serde(alias = "enabled")] @@ -60,7 +58,7 @@ impl Settings { PathBuf::from(p) } else { let mut config_file = PathBuf::new(); - let config_dir = atuin_common::utils::config_dir(); + let config_dir = crate::atuin_common::utils::config_dir(); config_file.push(config_dir); config_file }; @@ -87,27 +85,26 @@ impl Settings { .separator("__"), ); - config_builder = if config_file.exists() { - config_builder.add_source(ConfigFile::new( - config_file.to_str().unwrap(), - FileFormat::Toml, - )) + let config = if config_file.exists() { + config_builder + .add_source(ConfigFile::new( + config_file.to_str().unwrap(), + FileFormat::Toml, + )) + .build()? } else { create_dir_all(config_file.parent().unwrap())?; let mut file = File::create(config_file)?; - file.write_all(EXAMPLE_CONFIG.as_bytes())?; - config_builder - }; + let config = config_builder.build()?; + // TODO(@bpeetz): I'm quiet unsure, if this will work <2026-06-10> + file.write_all(config.cache.to_string().as_bytes())?; - let config = config_builder.build()?; + config + }; config .try_deserialize() .map_err(|e| eyre!("failed to deserialize: {}", e)) } } - -pub fn example_config() -> &'static str { - EXAMPLE_CONFIG -} diff --git a/crates/atuin-server/src/utils.rs b/crates/turtle/src/atuin_server/utils.rs index 12e9ac1b..12e9ac1b 100644 --- a/crates/atuin-server/src/utils.rs +++ b/crates/turtle/src/atuin_server/utils.rs diff --git a/crates/atuin-server-database/src/calendar.rs b/crates/turtle/src/atuin_server_database/calendar.rs index 2229667b..2229667b 100644 --- a/crates/atuin-server-database/src/calendar.rs +++ b/crates/turtle/src/atuin_server_database/calendar.rs diff --git a/crates/atuin-server-database/src/lib.rs b/crates/turtle/src/atuin_server_database/mod.rs index 5437fc15..91077b84 100644 --- a/crates/atuin-server-database/src/lib.rs +++ b/crates/turtle/src/atuin_server_database/mod.rs @@ -1,5 +1,3 @@ -#![forbid(unsafe_code)] - pub mod calendar; pub mod models; @@ -14,7 +12,7 @@ use self::{ models::{History, NewHistory, NewSession, NewUser, Session, User}, }; use async_trait::async_trait; -use atuin_common::record::{EncryptedData, HostId, Record, RecordIdx, RecordStatus}; +use crate::atuin_common::record::{EncryptedData, HostId, Record, RecordIdx, RecordStatus}; use serde::{Deserialize, Serialize}; use time::{Date, Duration, Month, OffsetDateTime, PrimitiveDateTime, Time, UtcOffset}; use tracing::instrument; diff --git a/crates/atuin-server-database/src/models.rs b/crates/turtle/src/atuin_server_database/models.rs index b71a9bc9..b71a9bc9 100644 --- a/crates/atuin-server-database/src/models.rs +++ b/crates/turtle/src/atuin_server_database/models.rs diff --git a/crates/atuin-server-postgres/src/lib.rs b/crates/turtle/src/atuin_server_postgres/mod.rs index 2e69c7f2..f506cf25 100644 --- a/crates/atuin-server-postgres/src/lib.rs +++ b/crates/turtle/src/atuin_server_postgres/mod.rs @@ -3,10 +3,12 @@ use std::ops::Range; use rand::Rng; +use crate::atuin_common::record::{EncryptedData, HostId, Record, RecordIdx, RecordStatus}; +use crate::atuin_server_database::models::{ + History, NewHistory, NewSession, NewUser, Session, User, +}; +use crate::atuin_server_database::{Database, DbError, DbResult, DbSettings, into_utc}; use async_trait::async_trait; -use atuin_common::record::{EncryptedData, HostId, Record, RecordIdx, RecordStatus}; -use atuin_server_database::models::{History, NewHistory, NewSession, NewUser, Session, User}; -use atuin_server_database::{Database, DbError, DbResult, DbSettings, into_utc}; use futures_util::TryStreamExt; use sqlx::Row; use sqlx::postgres::PgPoolOptions; @@ -289,7 +291,7 @@ impl Database for Postgres { sqlx::query( "insert into history - (client_id, user_id, hostname, timestamp, data) + (client_id, user_id, hostname, timestamp, data) values ($1, $2, $3, $4, $5) on conflict do nothing ", @@ -430,11 +432,11 @@ impl Database for Postgres { let mut heads = HashMap::<(HostId, &str), u64>::new(); for i in records { - let id = atuin_common::utils::uuid_v7(); + let id = crate::atuin_common::utils::uuid_v7(); let result = sqlx::query( "insert into store - (id, client_id, host, idx, timestamp, version, tag, data, cek, user_id) + (id, client_id, host, idx, timestamp, version, tag, data, cek, user_id) values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) on conflict do nothing ", @@ -469,7 +471,7 @@ impl Database for Postgres { for ((host, tag), idx) in heads { sqlx::query( "insert into store_idx_cache - (user_id, host, tag, idx) + (user_id, host, tag, idx) values ($1, $2, $3, $4) on conflict(user_id, host, tag) do update set idx = greatest(store_idx_cache.idx, $4) ", diff --git a/crates/atuin-server-postgres/src/wrappers.rs b/crates/turtle/src/atuin_server_postgres/wrappers.rs index cde4134c..214b255d 100644 --- a/crates/atuin-server-postgres/src/wrappers.rs +++ b/crates/turtle/src/atuin_server_postgres/wrappers.rs @@ -1,6 +1,6 @@ use ::sqlx::{FromRow, Result}; -use atuin_common::record::{EncryptedData, Host, Record}; -use atuin_server_database::models::{History, Session, User}; +use crate::atuin_common::record::{EncryptedData, Host, Record}; +use crate::atuin_server_database::models::{History, Session, User}; use sqlx::{Row, postgres::PgRow}; use time::PrimitiveDateTime; diff --git a/crates/atuin-server-sqlite/src/lib.rs b/crates/turtle/src/atuin_server_sqlite/mod.rs index 56ed9b6c..3470a2f1 100644 --- a/crates/atuin-server-sqlite/src/lib.rs +++ b/crates/turtle/src/atuin_server_sqlite/mod.rs @@ -1,11 +1,11 @@ use std::str::FromStr; -use async_trait::async_trait; -use atuin_common::record::{EncryptedData, HostId, Record, RecordIdx, RecordStatus}; -use atuin_server_database::{ +use crate::atuin_common::record::{EncryptedData, HostId, Record, RecordIdx, RecordStatus}; +use crate::atuin_server_database::{ Database, DbError, DbResult, DbSettings, into_utc, models::{History, NewHistory, NewSession, NewUser, Session, User}, }; +use async_trait::async_trait; use futures_util::TryStreamExt; use sqlx::{ Row, @@ -203,7 +203,7 @@ impl Database for Sqlite { // edge case. let res = sqlx::query( - "select client_id from history + "select client_id from history where user_id = $1 and deleted_at is not null", ) @@ -233,11 +233,11 @@ impl Database for Sqlite { let mut tx = self.pool.begin().await?; for i in records { - let id = atuin_common::utils::uuid_v7(); + let id = crate::atuin_common::utils::uuid_v7(); sqlx::query( "insert into store - (id, client_id, host, idx, timestamp, version, tag, data, cek, user_id) + (id, client_id, host, idx, timestamp, version, tag, data, cek, user_id) values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) on conflict do nothing ", @@ -394,7 +394,7 @@ impl Database for Sqlite { sqlx::query( "insert into history - (client_id, user_id, hostname, timestamp, data) + (client_id, user_id, hostname, timestamp, data) values ($1, $2, $3, $4, $5) on conflict do nothing ", @@ -416,7 +416,7 @@ impl Database for Sqlite { #[instrument(skip_all)] async fn oldest_history(&self, user: &User) -> DbResult<History> { sqlx::query_as( - "select id, client_id, user_id, hostname, timestamp, data, created_at from history + "select id, client_id, user_id, hostname, timestamp, data, created_at from history where user_id = $1 order by timestamp asc limit 1", diff --git a/crates/atuin-server-sqlite/src/wrappers.rs b/crates/turtle/src/atuin_server_sqlite/wrappers.rs index 2f1230c2..5aa7a982 100644 --- a/crates/atuin-server-sqlite/src/wrappers.rs +++ b/crates/turtle/src/atuin_server_sqlite/wrappers.rs @@ -1,6 +1,6 @@ use ::sqlx::{FromRow, Result}; -use atuin_common::record::{EncryptedData, Host, Record}; -use atuin_server_database::models::{History, Session, User}; +use crate::atuin_common::record::{EncryptedData, Host, Record}; +use crate::atuin_server_database::models::{History, Session, User}; use sqlx::{Row, sqlite::SqliteRow}; pub struct DbUser(pub User); |
