← Оглавление

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/.