8.1 Не с нуля
Два входа в одно хранилище - это полезно. Два входа в два хранилища с одним именем - это два отдельных инструмента, которые не подозревают о существовании друг друга. Разница обнаруживается не сразу: всё выглядит нормально ровно до тех пор, пока один вход не ищет то, что положили через другой.
Что нужно
Командная строка пишет задачи в tasks.json. Сервер мог бы читать из того же файла -
тогда оба входа вели бы в одно хранилище. Сейчас сервер всегда запускается с пустым
хранилищем. Несколько строк в crates/api/src/main.rs меняют это: загрузить конфиг,
загрузить задачи с диска, передать в TaskStore.
Постройка
Полный crates/api/src/main.rs:
// crates/api/src/main.rs - CHANGED
mod routes;
use axum::{Router, routing::get};
use routes::SharedStore;
use std::path::Path;
use std::sync::{Arc, Mutex};
use tq_core::config::Config;
use tq_core::persistence;
use tq_core::store::TaskStore;
async fn health() -> String {
"tq ok".to_string()
}
#[tokio::main]
async fn main() {
let config = Config::load(Path::new("config.toml"), None).unwrap_or_default();
let data_path = config.data_dir.join("tasks.json");
let tasks = persistence::load(&data_path).unwrap_or_default(); // empty vec if file missing
let store: SharedStore = Arc::new(Mutex::new(TaskStore::new(tasks)));
let app = Router::new()
.route("/", get(health))
.merge(routes::router(store));
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
axum::serve(listener, app).await.unwrap();
}
Результат
Добавим задачи через командную строку, затем запустим сервер. Если tasks.json остался
от предыдущих глав - сотрём его перед демонстрацией:
$ rm -f tasks.json
$ cargo run -p tq-cli -- add "buy milk"
$ cargo run -p tq-cli -- add "send report"
$ make serve
В другом терминале:
$ curl -s localhost:3000/tasks
[{"id":1,"title":"buy milk","status":"Todo","created_at":"2026-06-20T10:00:00Z"},
{"id":2,"title":"send report","status":"Todo","created_at":"2026-06-20T10:05:00Z"}]
Оба входа смотрят в один журнал. Задачи, добавленные через CLI, видны через API.
Задачи, добавленные через API, пока не сохраняются - все правки через сервер живут только в памяти процесса. Следующий шаг это исправит.
Полный код
tqдля этой главы -8-ready/01-not-from-scratch/.