Establishes version control for the personal Logseq DB fork before starting the server-client architecture migration and domain features described in docs/agent-guide and the approved implementation plan. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
95 lines
2.9 KiB
OCaml
95 lines
2.9 KiB
OCaml
open Cli_effect.Infix
|
|
|
|
type parsed = Parsed_login | Parsed_logout
|
|
type action = Login | Logout
|
|
|
|
let command_id = function
|
|
| Parsed_login -> Command_id.Login
|
|
| Parsed_logout -> Logout
|
|
|
|
let validate_parsed _ = Ok ()
|
|
|
|
let build ?registry:_ _ _ = function
|
|
| Parsed_login -> Ok Login
|
|
| Parsed_logout -> Ok Logout
|
|
|
|
let login_value (result : Auth_state.login_result) =
|
|
let fields =
|
|
Vec.of_array
|
|
[|
|
|
(Edn_util.keyword "auth-path", Edn_util.string result.auth_path);
|
|
(Edn_util.keyword "authorize-url", Edn_util.string result.authorize_url);
|
|
(Edn_util.keyword "opened", Edn_util.bool result.opened);
|
|
( Edn_util.keyword "updated-at",
|
|
Edn_util.int64 (Time.time_to_epoch_ms result.updated_at) );
|
|
|]
|
|
in
|
|
let fields =
|
|
match result.email with
|
|
| Some email ->
|
|
Vec.push_back fields (Edn_util.keyword "email", Edn_util.string email)
|
|
| None -> fields
|
|
in
|
|
let fields =
|
|
match result.sub with
|
|
| Some sub ->
|
|
Vec.push_back fields (Edn_util.keyword "sub", Edn_util.string sub)
|
|
| None -> fields
|
|
in
|
|
Edn_util.map_vec fields
|
|
|
|
let logout_value (result : Auth_state.logout_result) =
|
|
Edn_util.map_vec
|
|
(Vec.of_array
|
|
[|
|
|
(Edn_util.keyword "auth-path", Edn_util.string result.auth_path);
|
|
(Edn_util.keyword "deleted", Edn_util.bool result.deleted);
|
|
(Edn_util.keyword "logout-url", Edn_util.string result.logout_url);
|
|
(Edn_util.keyword "opened", Edn_util.bool result.opened);
|
|
( Edn_util.keyword "logout-completed",
|
|
Edn_util.bool result.logout_completed );
|
|
|])
|
|
|
|
let execute_with_mode action config mode =
|
|
match action with
|
|
| Login -> (
|
|
Auth_state.login config >>= function
|
|
| Ok result ->
|
|
Cli_effect.pure
|
|
(Cli_result.ok ~command:Command_id.Login mode
|
|
(Raw (login_value result)))
|
|
| Error err ->
|
|
Cli_effect.pure (Output_mode.error ~command:Command_id.Login mode err)
|
|
)
|
|
| Logout -> (
|
|
Auth_state.logout config >>= function
|
|
| Ok result ->
|
|
Cli_effect.pure
|
|
(Cli_result.ok ~command:Command_id.Logout mode
|
|
(Raw (logout_value result)))
|
|
| Error err ->
|
|
Cli_effect.pure
|
|
(Output_mode.error ~command:Command_id.Logout mode err))
|
|
|
|
let meta id doc =
|
|
{
|
|
Command_registry.id;
|
|
path = Command_id.to_path id;
|
|
doc;
|
|
long_doc = None;
|
|
examples = Vec.empty;
|
|
options = Vec.empty;
|
|
category = Command_registry.Authentication;
|
|
requires_graph = Command_id.requires_graph id;
|
|
requires_auth = Command_id.requires_auth id;
|
|
write_command = Command_id.is_write id;
|
|
human_table_headers_order = Vec.empty;
|
|
}
|
|
|
|
let metadata () =
|
|
Vec.of_array [| meta Command_id.Login "Login"; meta Logout "Logout" |]
|
|
|
|
let execute action config =
|
|
let (Output.Mode.Packed mode) = Output_mode.for_config config in
|
|
execute_with_mode action config mode
|