commit c201528e6068300f883ebefab1331baf318fcef7
parent cfa842ea04f7e91d2cd67c47982a58ae7c5433c5
Author: triesap <137732411+triesap@users.noreply.github.com>
Date: Mon, 13 Jan 2025 16:51:56 +0000
client: refactor core interface of app client
Diffstat:
34 files changed, 757 insertions(+), 1013 deletions(-)
diff --git a/client/src/database/tauri.ts b/client/src/database/tauri.ts
@@ -1,648 +1,506 @@
-import { LocationGcsSchema, LocationGcsUpdateSchema, LogErrorSchema, MediaUploadSchema, MediaUploadUpdateSchema, NostrProfileSchema, NostrProfileUpdateSchema, NostrRelaySchema, NostrRelayUpdateSchema, TradeProductSchema, TradeProductUpdateSchema, parse_location_gcs, parse_location_gcs_form_fields, parse_location_gcs_get_composite_list, parse_location_gcs_list, parse_log_error, parse_log_error_form_fields, parse_log_error_get_composite_list, parse_log_error_list, parse_media_upload, parse_media_upload_form_fields, parse_media_upload_get_composite_list, parse_media_upload_list, parse_nostr_profile, parse_nostr_profile_form_fields, parse_nostr_profile_get_composite_list, parse_nostr_profile_list, parse_nostr_profile_relay_list, parse_nostr_relay, parse_nostr_relay_form_fields, parse_nostr_relay_get_composite_list, parse_nostr_relay_list, parse_trade_product, parse_trade_product_form_fields, parse_trade_product_get_composite_list, parse_trade_product_list, parse_trade_product_location_list, parse_trade_product_media_list, type ILocationGcsAdd, type ILocationGcsAddResolve, type ILocationGcsDelete, type ILocationGcsDeleteResolve, type ILocationGcsGet, type ILocationGcsGetOne, type ILocationGcsGetOneResolve, type ILocationGcsGetResolve, type ILocationGcsUpdate, type ILocationGcsUpdateResolve, type ILogErrorAdd, type ILogErrorAddResolve, type ILogErrorDelete, type ILogErrorDeleteResolve, type ILogErrorGet, type ILogErrorGetOne, type ILogErrorGetOneResolve, type ILogErrorGetResolve, type IMediaUploadAdd, type IMediaUploadAddResolve, type IMediaUploadDelete, type IMediaUploadDeleteResolve, type IMediaUploadGet, type IMediaUploadGetOne, type IMediaUploadGetOneResolve, type IMediaUploadGetResolve, type IMediaUploadUpdate, type IMediaUploadUpdateResolve, type IModelsQueryBindValueTuple, type IModelsQueryValue, type INostrProfileAdd, type INostrProfileAddResolve, type INostrProfileDelete, type INostrProfileDeleteResolve, type INostrProfileGet, type INostrProfileGetOne, type INostrProfileGetOneResolve, type INostrProfileGetResolve, type INostrProfileRelayRelation, type INostrProfileRelayRelationResolve, type INostrProfileRelayRelationResolveGetAll, type INostrProfileUpdate, type INostrProfileUpdateResolve, type INostrRelayAdd, type INostrRelayAddResolve, type INostrRelayDelete, type INostrRelayDeleteResolve, type INostrRelayGet, type INostrRelayGetOne, type INostrRelayGetOneResolve, type INostrRelayGetResolve, type INostrRelayUpdate, type INostrRelayUpdateResolve, type ITradeProductAdd, type ITradeProductAddResolve, type ITradeProductDelete, type ITradeProductDeleteResolve, type ITradeProductGet, type ITradeProductGetOne, type ITradeProductGetOneResolve, type ITradeProductGetResolve, type ITradeProductLocationRelation, type ITradeProductLocationRelationResolve, type ITradeProductLocationRelationResolveGetAll, type ITradeProductMediaRelation, type ITradeProductMediaRelationResolve, type ITradeProductMediaRelationResolveGetAll, type ITradeProductUpdate, type ITradeProductUpdateResolve, type LocationGcsFields, type LocationGcsFormFields, type LogErrorFields, type LogErrorFormFields, type MediaUploadFields, type MediaUploadFormFields, type NostrProfileFields, type NostrProfileFormFields, type NostrRelayFields, type NostrRelayFormFields, type TradeProductFields, type TradeProductFormFields } from "@radroots/models";
-import { err_msg, type ErrorMessage } from "@radroots/utils";
+import { location_gcs_parse, location_gcs_parse_list, location_gcs_parse_select_query, location_gcs_parse_select_query_list, location_gcs_parse_update_query, location_gcs_validate_form_fields, location_gcs_validate_update_form_fields, log_error_parse, log_error_parse_list, log_error_parse_select_query, log_error_parse_select_query_list, log_error_parse_update_query, log_error_validate_form_fields, log_error_validate_update_form_fields, media_image_parse, media_image_parse_list, media_image_parse_select_query, media_image_parse_select_query_list, media_image_parse_update_query, media_image_validate_form_fields, media_image_validate_update_form_fields, nostr_profile_parse, nostr_profile_parse_list, nostr_profile_parse_select_query, nostr_profile_parse_select_query_list, nostr_profile_parse_update_query, nostr_profile_validate_form_fields, nostr_profile_validate_update_form_fields, nostr_relay_parse, nostr_relay_parse_list, nostr_relay_parse_select_query, nostr_relay_parse_select_query_list, nostr_relay_parse_update_query, nostr_relay_validate_form_fields, nostr_relay_validate_update_form_fields, trade_product_parse, trade_product_parse_list, trade_product_parse_select_query, trade_product_parse_select_query_list, trade_product_parse_update_query, trade_product_validate_form_fields, trade_product_validate_update_form_fields, type ILocationGcsCreate, type ILocationGcsCreateHandler, type ILocationGcsCreateResolve, type ILocationGcsDelete, type ILocationGcsDeleteHandler, type ILocationGcsDeleteResolve, type ILocationGcsRead, type ILocationGcsReadHandler, type ILocationGcsReadList, type ILocationGcsReadListHandler, type ILocationGcsReadListResolve, type ILocationGcsReadResolve, type ILocationGcsUpdate, type ILocationGcsUpdateHandler, type ILocationGcsUpdateResolve, type ILogErrorCreate, type ILogErrorCreateHandler, type ILogErrorCreateResolve, type ILogErrorDelete, type ILogErrorDeleteHandler, type ILogErrorDeleteResolve, type ILogErrorRead, type ILogErrorReadHandler, type ILogErrorReadList, type ILogErrorReadListHandler, type ILogErrorReadListResolve, type ILogErrorReadResolve, type ILogErrorUpdate, type ILogErrorUpdateHandler, type ILogErrorUpdateResolve, type IMediaImageCreate, type IMediaImageCreateHandler, type IMediaImageCreateResolve, type IMediaImageDelete, type IMediaImageDeleteHandler, type IMediaImageDeleteResolve, type IMediaImageRead, type IMediaImageReadHandler, type IMediaImageReadList, type IMediaImageReadListHandler, type IMediaImageReadListResolve, type IMediaImageReadResolve, type IMediaImageUpdate, type IMediaImageUpdateHandler, type IMediaImageUpdateResolve, type INostrProfileCreate, type INostrProfileCreateHandler, type INostrProfileCreateResolve, type INostrProfileDelete, type INostrProfileDeleteHandler, type INostrProfileDeleteResolve, type INostrProfileRead, type INostrProfileReadHandler, type INostrProfileReadList, type INostrProfileReadListHandler, type INostrProfileReadListResolve, type INostrProfileReadResolve, type INostrProfileRelayRelation, type INostrProfileRelayResolve, type INostrProfileUpdate, type INostrProfileUpdateHandler, type INostrProfileUpdateResolve, type INostrRelayCreate, type INostrRelayCreateHandler, type INostrRelayCreateResolve, type INostrRelayDelete, type INostrRelayDeleteHandler, type INostrRelayDeleteResolve, type INostrRelayRead, type INostrRelayReadHandler, type INostrRelayReadList, type INostrRelayReadListHandler, type INostrRelayReadListResolve, type INostrRelayReadResolve, type INostrRelayUpdate, type INostrRelayUpdateHandler, type INostrRelayUpdateResolve, type ITradeProductCreate, type ITradeProductCreateHandler, type ITradeProductCreateResolve, type ITradeProductDelete, type ITradeProductDeleteHandler, type ITradeProductDeleteResolve, type ITradeProductLocationRelation, type ITradeProductLocationResolve, type ITradeProductMediaRelation, type ITradeProductMediaResolve, type ITradeProductRead, type ITradeProductReadHandler, type ITradeProductReadList, type ITradeProductReadListHandler, type ITradeProductReadListResolve, type ITradeProductReadResolve, type ITradeProductUpdate, type ITradeProductUpdateHandler, type ITradeProductUpdateResolve } from "@radroots/models";
+import { err_msg, is_err_response, is_pass_response, is_result_response, is_results_response, type ErrorMessage } from "@radroots/utils";
import { invoke } from "@tauri-apps/api/core";
-import type { IClientDatabase, IClientDatabaseMessage } from "./types";
-
-export class TauriClientDatabase implements IClientDatabase {
- private append_logs(scope: string, opts: any, error: any): IClientDatabaseMessage {
- console.log("todo... append_logs");
+import type { IClientTauriDatabase, IClientTauriDatabaseMessage } from "./types";
+
+export class TauriClientDatabase implements IClientTauriDatabase {
+ private append_logs(scope: string, opts: any, error: any): IClientTauriDatabaseMessage {
+ console.log('[database:tauri] append logs')
+ console.log('scope ', scope)
+ console.log('opts ', opts)
+ console.log('error ', error)
const error_msg = String(error);
- return error_msg;
+ return `append-logs-${error_msg}`;
}
-
- private handle_errors(scope: string, opts: any, e: any): ErrorMessage<IClientDatabaseMessage> {
+
+ private handle_errors(scope: string, opts: any, e: any): ErrorMessage<IClientTauriDatabaseMessage> {
const error = this.append_logs(scope, opts, e);
if (error.includes("UNIQUE constraint failed: location_gcs.geohash")) return err_msg("*-location-gcs-geohash-unique");
else if (error.includes("UNIQUE constraint failed: nostr_relay.url")) return err_msg("*-nostr-relay-url-unique");
return err_msg(error);
}
- private filter_bind_value_fields(fields: IModelsQueryBindValueTuple[]): IModelsQueryBindValueTuple[] {
- return fields.filter(([_, v]) => !!v);
- }
-
- private location_gcs_add_validate(fields: LocationGcsFormFields): LocationGcsFields | string[] {
- const fields_r = Object.entries(fields).filter(([_, v]) => !!v).reduce((acc: Record<string, IModelsQueryValue>, i) => {
- const [key, val] = parse_location_gcs_form_fields(i);
- acc[key] = val;
- return acc;
- }, {});
- const schema = LocationGcsSchema;
- const parsed_schema = schema.safeParse(fields_r);
- if (!parsed_schema.success) return parsed_schema.error.issues.map(i => i.message);
- else return {
- ...parsed_schema.data
- };
- }
-
- public async location_gcs_add(opts: ILocationGcsAdd): Promise<ILocationGcsAddResolve<IClientDatabaseMessage>> {
- const err_s = this.location_gcs_add_validate(opts);
- if (Array.isArray(err_s)) return { err_s };
- const fields = this.filter_bind_value_fields(Object.entries(err_s));
- if (!fields.length) return err_msg("*-fields");
+ public reset = async (): Promise<{ pass: true } | ErrorMessage<IClientTauriDatabaseMessage>> => {
try {
- const response = await invoke<any>("model_location_gcs_add", { opts });
- if ("id" in response && typeof response.id === "string") return { id: response.id };
- else if (typeof response === "string") return err_msg(response);
- return err_msg("*-result");
+ const response = await invoke<any>("model_tables_reset");
+ return { pass: true };
} catch (e) {
- return this.handle_errors("model_location_gcs_add", opts, e);
+ return this.handle_errors("reset", undefined, e);
};
}
- public async location_gcs_get(opts: ILocationGcsGet): Promise<ILocationGcsGetResolve<IClientDatabaseMessage>> {
+ public async location_gcs_create(opts: ILocationGcsCreate): Promise<ILocationGcsCreateResolve<IClientTauriDatabaseMessage>> {
try {
- const response = await invoke<any>("model_location_gcs_get", { opts: "list" in opts ? { list: { of: parse_location_gcs_get_composite_list(opts.list), sort: opts.sort } } : { on: opts } });
- if (typeof response === "string") return err_msg(response);
- else if ("results" in response && Array.isArray(response.results)) return { results: parse_location_gcs_list(response.results) };
+ const args = location_gcs_validate_form_fields(opts);
+ if (Array.isArray(args)) return { err_s: args };
+ const response = await invoke<any>("model_location_gcs_create", { args } satisfies ILocationGcsCreateHandler);
+ if (is_err_response(response)) return err_msg(response.err);
+ else if (is_result_response(response)) return { id: response.result };
return err_msg("*-result");
} catch (e) {
- return this.handle_errors("model_location_gcs_get", opts, e);
+ return this.handle_errors("model_location_gcs_create", opts, e);
};
}
- public async location_gcs_get_one(opts: ILocationGcsGetOne): Promise<ILocationGcsGetOneResolve<IClientDatabaseMessage>> {
+ public async location_gcs_read(opts: ILocationGcsRead): Promise<ILocationGcsReadResolve<IClientTauriDatabaseMessage>> {
try {
- const response = await invoke<any>("model_location_gcs_get", { opts: { on: opts } });
- if (typeof response === "string") return err_msg(response);
- else if ("results" in response && Array.isArray(response.results) && response.results.length === 1) {
- const result = parse_location_gcs(response.results[0]);
+ const args = location_gcs_parse_select_query(opts);
+ const response = await invoke<any>("model_location_gcs_read", { args } satisfies ILocationGcsReadHandler);
+ if (is_err_response(response)) return err_msg(response.err);
+ else if (is_results_response(response)) {
+ const result = location_gcs_parse(response.results[0]);
if (result) return { result };
}
return err_msg("*-result");
} catch (e) {
- return this.handle_errors("model_location_gcs_get", opts, e);
+ return this.handle_errors("model_location_gcs_read", opts, e);
};
}
- public async location_gcs_delete(opts: ILocationGcsDelete): Promise<ILocationGcsDeleteResolve<IClientDatabaseMessage>> {
+ public async location_gcs_read_list(opts?: ILocationGcsReadList): Promise<ILocationGcsReadListResolve<IClientTauriDatabaseMessage>> {
try {
- const response = await invoke<any>("model_location_gcs_delete", { opts });
- if (response === null) return { pass: true };
- else if (typeof response === "string") return err_msg(response);
+ const args = location_gcs_parse_select_query_list(opts);
+ const response = await invoke<any>("model_location_gcs_read_list", { args } satisfies ILocationGcsReadListHandler);
+ if (is_err_response(response)) return err_msg(response.err);
+ else if (is_results_response(response)) {
+ const results = location_gcs_parse_list(response.results);
+ if (results.length) return { results };
+ }
return err_msg("*-result");
} catch (e) {
- return this.handle_errors("model_location_gcs_delete", opts, e);
- };
- }
- private location_gcs_update_validate(fields: Partial<LocationGcsFormFields>): Partial<LocationGcsFields> | string[] {
- const fields_r = Object.entries(fields).filter(([_, v]) => !!v).reduce((acc: Record<string, IModelsQueryValue>, i) => {
- const [key, val] = parse_location_gcs_form_fields(i);
- acc[key] = val;
- return acc;
- }, {});
- const schema = LocationGcsUpdateSchema;
- const parsed_schema = schema.safeParse(fields_r);
- if (!parsed_schema.success) return parsed_schema.error.issues.map(i => i.message);
- else return {
- ...parsed_schema.data
+ return this.handle_errors("model_location_gcs_read_list", opts, e);
};
}
- public async location_gcs_update(opts: ILocationGcsUpdate): Promise<ILocationGcsUpdateResolve<IClientDatabaseMessage>> {
- const err_s = this.location_gcs_update_validate(opts.fields);
- if (Array.isArray(err_s)) return { err_s };
- const fields = this.filter_bind_value_fields(Object.entries(err_s));
- if (!fields.length) return err_msg("*-fields");
+ public async location_gcs_update(opts: ILocationGcsUpdate): Promise<ILocationGcsUpdateResolve<IClientTauriDatabaseMessage>> {
try {
- const response = await invoke<any>("model_location_gcs_update", { opts });
- if (response === null) return { pass: true };
- else if (typeof response === "string") return err_msg(response);
+ const fields = location_gcs_validate_update_form_fields(opts.fields);
+ if (Array.isArray(fields)) return { err_s: fields };
+ const args = location_gcs_parse_update_query(opts.filter, fields);
+ const response = await invoke<any>("model_location_gcs_update", { args } satisfies ILocationGcsUpdateHandler);
+ if (is_err_response(response)) return err_msg(response.err);
+ else if (is_pass_response(response)) return { pass: true };
return err_msg("*-result");
} catch (e) {
return this.handle_errors("model_location_gcs_update", opts, e);
};
}
- private trade_product_add_validate(fields: TradeProductFormFields): TradeProductFields | string[] {
- const fields_r = Object.entries(fields).filter(([_, v]) => !!v).reduce((acc: Record<string, IModelsQueryValue>, i) => {
- const [key, val] = parse_trade_product_form_fields(i);
- acc[key] = val;
- return acc;
- }, {});
- const schema = TradeProductSchema;
- const parsed_schema = schema.safeParse(fields_r);
- if (!parsed_schema.success) return parsed_schema.error.issues.map(i => i.message);
- else return {
- ...parsed_schema.data
- };
- }
- public async trade_product_add(opts: ITradeProductAdd): Promise<ITradeProductAddResolve<IClientDatabaseMessage>> {
- const err_s = this.trade_product_add_validate(opts);
- if (Array.isArray(err_s)) return { err_s };
- const fields = this.filter_bind_value_fields(Object.entries(err_s));
- if (!fields.length) return err_msg("*-fields");
+ public async location_gcs_delete(args: ILocationGcsDelete): Promise<ILocationGcsDeleteResolve<IClientTauriDatabaseMessage>> {
try {
- const response = await invoke<any>("model_trade_product_add", { opts });
- if ("id" in response && typeof response.id === "string") return { id: response.id };
- else if (typeof response === "string") return err_msg(response);
+ const response = await invoke<any>("model_location_gcs_delete", { args } satisfies ILocationGcsDeleteHandler);
+ if (is_err_response(response)) return err_msg(response.err);
+ else if (is_pass_response(response)) return { pass: true };
return err_msg("*-result");
} catch (e) {
- return this.handle_errors("model_trade_product_add", opts, e);
+ return this.handle_errors("model_location_gcs_delete", args, e);
};
}
- public async trade_product_get(opts: ITradeProductGet): Promise<ITradeProductGetResolve<IClientDatabaseMessage>> {
+ public async trade_product_create(opts: ITradeProductCreate): Promise<ITradeProductCreateResolve<IClientTauriDatabaseMessage>> {
try {
- const response = await invoke<any>("model_trade_product_get", { opts: "list" in opts ? { list: { of: parse_trade_product_get_composite_list(opts.list), sort: opts.sort } } : { on: opts } });
- if (typeof response === "string") return err_msg(response);
- else if ("results" in response && Array.isArray(response.results)) return { results: parse_trade_product_list(response.results) };
+ const args = trade_product_validate_form_fields(opts);
+ if (Array.isArray(args)) return { err_s: args };
+ const response = await invoke<any>("model_trade_product_create", { args } satisfies ITradeProductCreateHandler);
+ if (is_err_response(response)) return err_msg(response.err);
+ else if (is_result_response(response)) return { id: response.result };
return err_msg("*-result");
} catch (e) {
- return this.handle_errors("model_trade_product_get", opts, e);
+ return this.handle_errors("model_trade_product_create", opts, e);
};
}
- public async trade_product_get_one(opts: ITradeProductGetOne): Promise<ITradeProductGetOneResolve<IClientDatabaseMessage>> {
+ public async trade_product_read(opts: ITradeProductRead): Promise<ITradeProductReadResolve<IClientTauriDatabaseMessage>> {
try {
- const response = await invoke<any>("model_trade_product_get", { opts: { on: opts } });
- if (typeof response === "string") return err_msg(response);
- else if ("results" in response && Array.isArray(response.results) && response.results.length === 1) {
- const result = parse_trade_product(response.results[0]);
+ const args = trade_product_parse_select_query(opts);
+ const response = await invoke<any>("model_trade_product_read", { args } satisfies ITradeProductReadHandler);
+ if (is_err_response(response)) return err_msg(response.err);
+ else if (is_results_response(response)) {
+ const result = trade_product_parse(response.results[0]);
if (result) return { result };
}
return err_msg("*-result");
} catch (e) {
- return this.handle_errors("model_trade_product_get", opts, e);
+ return this.handle_errors("model_trade_product_read", opts, e);
};
}
- public async trade_product_delete(opts: ITradeProductDelete): Promise<ITradeProductDeleteResolve<IClientDatabaseMessage>> {
+ public async trade_product_read_list(opts?: ITradeProductReadList): Promise<ITradeProductReadListResolve<IClientTauriDatabaseMessage>> {
try {
- const response = await invoke<any>("model_trade_product_delete", { opts });
- if (response === null) return { pass: true };
- else if (typeof response === "string") return err_msg(response);
+ const args = trade_product_parse_select_query_list(opts);
+ const response = await invoke<any>("model_trade_product_read_list", { args } satisfies ITradeProductReadListHandler);
+ if (is_err_response(response)) return err_msg(response.err);
+ else if (is_results_response(response)) {
+ const results = trade_product_parse_list(response.results);
+ if (results.length) return { results };
+ }
return err_msg("*-result");
} catch (e) {
- return this.handle_errors("model_trade_product_delete", opts, e);
- };
- }
- private trade_product_update_validate(fields: Partial<TradeProductFormFields>): Partial<TradeProductFields> | string[] {
- const fields_r = Object.entries(fields).filter(([_, v]) => !!v).reduce((acc: Record<string, IModelsQueryValue>, i) => {
- const [key, val] = parse_trade_product_form_fields(i);
- acc[key] = val;
- return acc;
- }, {});
- const schema = TradeProductUpdateSchema;
- const parsed_schema = schema.safeParse(fields_r);
- if (!parsed_schema.success) return parsed_schema.error.issues.map(i => i.message);
- else return {
- ...parsed_schema.data
+ return this.handle_errors("model_trade_product_read_list", opts, e);
};
}
- public async trade_product_update(opts: ITradeProductUpdate): Promise<ITradeProductUpdateResolve<IClientDatabaseMessage>> {
- const err_s = this.trade_product_update_validate(opts.fields);
- if (Array.isArray(err_s)) return { err_s };
- const fields = this.filter_bind_value_fields(Object.entries(err_s));
- if (!fields.length) return err_msg("*-fields");
+ public async trade_product_update(opts: ITradeProductUpdate): Promise<ITradeProductUpdateResolve<IClientTauriDatabaseMessage>> {
try {
- const response = await invoke<any>("model_trade_product_update", { opts });
- if (response === null) return { pass: true };
- else if (typeof response === "string") return err_msg(response);
+ const fields = trade_product_validate_update_form_fields(opts.fields);
+ if (Array.isArray(fields)) return { err_s: fields };
+ const args = trade_product_parse_update_query(opts.filter, fields);
+ const response = await invoke<any>("model_trade_product_update", { args } satisfies ITradeProductUpdateHandler);
+ if (is_err_response(response)) return err_msg(response.err);
+ else if (is_pass_response(response)) return { pass: true };
return err_msg("*-result");
} catch (e) {
return this.handle_errors("model_trade_product_update", opts, e);
};
}
- private nostr_profile_add_validate(fields: NostrProfileFormFields): NostrProfileFields | string[] {
- const fields_r = Object.entries(fields).filter(([_, v]) => !!v).reduce((acc: Record<string, IModelsQueryValue>, i) => {
- const [key, val] = parse_nostr_profile_form_fields(i);
- acc[key] = val;
- return acc;
- }, {});
- const schema = NostrProfileSchema;
- const parsed_schema = schema.safeParse(fields_r);
- if (!parsed_schema.success) return parsed_schema.error.issues.map(i => i.message);
- else return {
- ...parsed_schema.data
- };
- }
- public async nostr_profile_add(opts: INostrProfileAdd): Promise<INostrProfileAddResolve<IClientDatabaseMessage>> {
- const err_s = this.nostr_profile_add_validate(opts);
- if (Array.isArray(err_s)) return { err_s };
- const fields = this.filter_bind_value_fields(Object.entries(err_s));
- if (!fields.length) return err_msg("*-fields");
+ public async trade_product_delete(args: ITradeProductDelete): Promise<ITradeProductDeleteResolve<IClientTauriDatabaseMessage>> {
try {
- const response = await invoke<any>("model_nostr_profile_add", { opts });
- if ("id" in response && typeof response.id === "string") return { id: response.id };
- else if (typeof response === "string") return err_msg(response);
+ const response = await invoke<any>("model_trade_product_delete", { args } satisfies ITradeProductDeleteHandler);
+ if (is_err_response(response)) return err_msg(response.err);
+ else if (is_pass_response(response)) return { pass: true };
return err_msg("*-result");
} catch (e) {
- return this.handle_errors("model_nostr_profile_add", opts, e);
+ return this.handle_errors("model_trade_product_delete", args, e);
};
}
- public async nostr_profile_get(opts: INostrProfileGet): Promise<INostrProfileGetResolve<IClientDatabaseMessage>> {
+ public async nostr_profile_create(opts: INostrProfileCreate): Promise<INostrProfileCreateResolve<IClientTauriDatabaseMessage>> {
try {
- const response = await invoke<any>("model_nostr_profile_get", { opts: "list" in opts ? { list: { of: parse_nostr_profile_get_composite_list(opts.list), sort: opts.sort } } : { on: opts } });
- if (typeof response === "string") return err_msg(response);
- else if ("results" in response && Array.isArray(response.results)) return { results: parse_nostr_profile_list(response.results) };
+ const args = nostr_profile_validate_form_fields(opts);
+ if (Array.isArray(args)) return { err_s: args };
+ const response = await invoke<any>("model_nostr_profile_create", { args } satisfies INostrProfileCreateHandler);
+ if (is_err_response(response)) return err_msg(response.err);
+ else if (is_result_response(response)) return { id: response.result };
return err_msg("*-result");
} catch (e) {
- return this.handle_errors("model_nostr_profile_get", opts, e);
+ return this.handle_errors("model_nostr_profile_create", opts, e);
};
}
- public async nostr_profile_get_one(opts: INostrProfileGetOne): Promise<INostrProfileGetOneResolve<IClientDatabaseMessage>> {
+ public async nostr_profile_read(opts: INostrProfileRead): Promise<INostrProfileReadResolve<IClientTauriDatabaseMessage>> {
try {
- const response = await invoke<any>("model_nostr_profile_get", { opts: { on: opts } });
- if (typeof response === "string") return err_msg(response);
- else if ("results" in response && Array.isArray(response.results) && response.results.length === 1) {
- const result = parse_nostr_profile(response.results[0]);
+ const args = nostr_profile_parse_select_query(opts);
+ const response = await invoke<any>("model_nostr_profile_read", { args } satisfies INostrProfileReadHandler);
+ if (is_err_response(response)) return err_msg(response.err);
+ else if (is_results_response(response)) {
+ const result = nostr_profile_parse(response.results[0]);
if (result) return { result };
}
return err_msg("*-result");
} catch (e) {
- return this.handle_errors("model_nostr_profile_get", opts, e);
+ return this.handle_errors("model_nostr_profile_read", opts, e);
};
}
- public async nostr_profile_delete(opts: INostrProfileDelete): Promise<INostrProfileDeleteResolve<IClientDatabaseMessage>> {
+ public async nostr_profile_read_list(opts?: INostrProfileReadList): Promise<INostrProfileReadListResolve<IClientTauriDatabaseMessage>> {
try {
- const response = await invoke<any>("model_nostr_profile_delete", { opts });
- if (response === null) return { pass: true };
- else if (typeof response === "string") return err_msg(response);
+ const args = nostr_profile_parse_select_query_list(opts);
+ const response = await invoke<any>("model_nostr_profile_read_list", { args } satisfies INostrProfileReadListHandler);
+ if (is_err_response(response)) return err_msg(response.err);
+ else if (is_results_response(response)) {
+ const results = nostr_profile_parse_list(response.results);
+ if (results.length) return { results };
+ }
return err_msg("*-result");
} catch (e) {
- return this.handle_errors("model_nostr_profile_delete", opts, e);
- };
- }
- private nostr_profile_update_validate(fields: Partial<NostrProfileFormFields>): Partial<NostrProfileFields> | string[] {
- const fields_r = Object.entries(fields).filter(([_, v]) => !!v).reduce((acc: Record<string, IModelsQueryValue>, i) => {
- const [key, val] = parse_nostr_profile_form_fields(i);
- acc[key] = val;
- return acc;
- }, {});
- const schema = NostrProfileUpdateSchema;
- const parsed_schema = schema.safeParse(fields_r);
- if (!parsed_schema.success) return parsed_schema.error.issues.map(i => i.message);
- else return {
- ...parsed_schema.data
+ return this.handle_errors("model_nostr_profile_read_list", opts, e);
};
}
- public async nostr_profile_update(opts: INostrProfileUpdate): Promise<INostrProfileUpdateResolve<IClientDatabaseMessage>> {
- const err_s = this.nostr_profile_update_validate(opts.fields);
- if (Array.isArray(err_s)) return { err_s };
- const fields = this.filter_bind_value_fields(Object.entries(err_s));
- if (!fields.length) return err_msg("*-fields");
+ public async nostr_profile_update(opts: INostrProfileUpdate): Promise<INostrProfileUpdateResolve<IClientTauriDatabaseMessage>> {
try {
- const response = await invoke<any>("model_nostr_profile_update", { opts });
- if (response === null) return { pass: true };
- else if (typeof response === "string") return err_msg(response);
+ const fields = nostr_profile_validate_update_form_fields(opts.fields);
+ if (Array.isArray(fields)) return { err_s: fields };
+ const args = nostr_profile_parse_update_query(opts.filter, fields);
+ const response = await invoke<any>("model_nostr_profile_update", { args } satisfies INostrProfileUpdateHandler);
+ if (is_err_response(response)) return err_msg(response.err);
+ else if (is_pass_response(response)) return { pass: true };
return err_msg("*-result");
} catch (e) {
return this.handle_errors("model_nostr_profile_update", opts, e);
};
}
- private nostr_relay_add_validate(fields: NostrRelayFormFields): NostrRelayFields | string[] {
- const fields_r = Object.entries(fields).filter(([_, v]) => !!v).reduce((acc: Record<string, IModelsQueryValue>, i) => {
- const [key, val] = parse_nostr_relay_form_fields(i);
- acc[key] = val;
- return acc;
- }, {});
- const schema = NostrRelaySchema;
- const parsed_schema = schema.safeParse(fields_r);
- if (!parsed_schema.success) return parsed_schema.error.issues.map(i => i.message);
- else return {
- ...parsed_schema.data
- };
- }
- public async nostr_relay_add(opts: INostrRelayAdd): Promise<INostrRelayAddResolve<IClientDatabaseMessage>> {
- const err_s = this.nostr_relay_add_validate(opts);
- if (Array.isArray(err_s)) return { err_s };
- const fields = this.filter_bind_value_fields(Object.entries(err_s));
- if (!fields.length) return err_msg("*-fields");
+ public async nostr_profile_delete(args: INostrProfileDelete): Promise<INostrProfileDeleteResolve<IClientTauriDatabaseMessage>> {
try {
- const response = await invoke<any>("model_nostr_relay_add", { opts });
- if ("id" in response && typeof response.id === "string") return { id: response.id };
- else if (typeof response === "string") return err_msg(response);
+ const response = await invoke<any>("model_nostr_profile_delete", { args } satisfies INostrProfileDeleteHandler);
+ if (is_err_response(response)) return err_msg(response.err);
+ else if (is_pass_response(response)) return { pass: true };
return err_msg("*-result");
} catch (e) {
- return this.handle_errors("model_nostr_relay_add", opts, e);
+ return this.handle_errors("model_nostr_profile_delete", args, e);
};
}
- public async nostr_relay_get(opts: INostrRelayGet): Promise<INostrRelayGetResolve<IClientDatabaseMessage>> {
+ public async nostr_relay_create(opts: INostrRelayCreate): Promise<INostrRelayCreateResolve<IClientTauriDatabaseMessage>> {
try {
- const response = await invoke<any>("model_nostr_relay_get", { opts: "list" in opts ? { list: { of: parse_nostr_relay_get_composite_list(opts.list), sort: opts.sort } } : { on: opts } });
- if (typeof response === "string") return err_msg(response);
- else if ("results" in response && Array.isArray(response.results)) return { results: parse_nostr_relay_list(response.results) };
+ const args = nostr_relay_validate_form_fields(opts);
+ if (Array.isArray(args)) return { err_s: args };
+ const response = await invoke<any>("model_nostr_relay_create", { args } satisfies INostrRelayCreateHandler);
+ if (is_err_response(response)) return err_msg(response.err);
+ else if (is_result_response(response)) return { id: response.result };
return err_msg("*-result");
} catch (e) {
- return this.handle_errors("model_nostr_relay_get", opts, e);
+ return this.handle_errors("model_nostr_relay_create", opts, e);
};
}
- public async nostr_relay_get_one(opts: INostrRelayGetOne): Promise<INostrRelayGetOneResolve<IClientDatabaseMessage>> {
+ public async nostr_relay_read(opts: INostrRelayRead): Promise<INostrRelayReadResolve<IClientTauriDatabaseMessage>> {
try {
- const response = await invoke<any>("model_nostr_relay_get", { opts: { on: opts } });
- if (typeof response === "string") return err_msg(response);
- else if ("results" in response && Array.isArray(response.results) && response.results.length === 1) {
- const result = parse_nostr_relay(response.results[0]);
+ const args = nostr_relay_parse_select_query(opts);
+ const response = await invoke<any>("model_nostr_relay_read", { args } satisfies INostrRelayReadHandler);
+ if (is_err_response(response)) return err_msg(response.err);
+ else if (is_results_response(response)) {
+ const result = nostr_relay_parse(response.results[0]);
if (result) return { result };
}
return err_msg("*-result");
} catch (e) {
- return this.handle_errors("model_nostr_relay_get", opts, e);
+ return this.handle_errors("model_nostr_relay_read", opts, e);
};
}
- public async nostr_relay_delete(opts: INostrRelayDelete): Promise<INostrRelayDeleteResolve<IClientDatabaseMessage>> {
+ public async nostr_relay_read_list(opts?: INostrRelayReadList): Promise<INostrRelayReadListResolve<IClientTauriDatabaseMessage>> {
try {
- const response = await invoke<any>("model_nostr_relay_delete", { opts });
- if (response === null) return { pass: true };
- else if (typeof response === "string") return err_msg(response);
+ const args = nostr_relay_parse_select_query_list(opts);
+ const response = await invoke<any>("model_nostr_relay_read_list", { args } satisfies INostrRelayReadListHandler);
+ if (is_err_response(response)) return err_msg(response.err);
+ else if (is_results_response(response)) {
+ const results = nostr_relay_parse_list(response.results);
+ if (results.length) return { results };
+ }
return err_msg("*-result");
} catch (e) {
- return this.handle_errors("model_nostr_relay_delete", opts, e);
- };
- }
- private nostr_relay_update_validate(fields: Partial<NostrRelayFormFields>): Partial<NostrRelayFields> | string[] {
- const fields_r = Object.entries(fields).filter(([_, v]) => !!v).reduce((acc: Record<string, IModelsQueryValue>, i) => {
- const [key, val] = parse_nostr_relay_form_fields(i);
- acc[key] = val;
- return acc;
- }, {});
- const schema = NostrRelayUpdateSchema;
- const parsed_schema = schema.safeParse(fields_r);
- if (!parsed_schema.success) return parsed_schema.error.issues.map(i => i.message);
- else return {
- ...parsed_schema.data
+ return this.handle_errors("model_nostr_relay_read_list", opts, e);
};
}
- public async nostr_relay_update(opts: INostrRelayUpdate): Promise<INostrRelayUpdateResolve<IClientDatabaseMessage>> {
- const err_s = this.nostr_relay_update_validate(opts.fields);
- if (Array.isArray(err_s)) return { err_s };
- const fields = this.filter_bind_value_fields(Object.entries(err_s));
- if (!fields.length) return err_msg("*-fields");
+ public async nostr_relay_update(opts: INostrRelayUpdate): Promise<INostrRelayUpdateResolve<IClientTauriDatabaseMessage>> {
try {
- const response = await invoke<any>("model_nostr_relay_update", { opts });
- if (response === null) return { pass: true };
- else if (typeof response === "string") return err_msg(response);
+ const fields = nostr_relay_validate_update_form_fields(opts.fields);
+ if (Array.isArray(fields)) return { err_s: fields };
+ const args = nostr_relay_parse_update_query(opts.filter, fields);
+ const response = await invoke<any>("model_nostr_relay_update", { args } satisfies INostrRelayUpdateHandler);
+ if (is_err_response(response)) return err_msg(response.err);
+ else if (is_pass_response(response)) return { pass: true };
return err_msg("*-result");
} catch (e) {
return this.handle_errors("model_nostr_relay_update", opts, e);
};
}
- private media_upload_add_validate(fields: MediaUploadFormFields): MediaUploadFields | string[] {
- const fields_r = Object.entries(fields).filter(([_, v]) => !!v).reduce((acc: Record<string, IModelsQueryValue>, i) => {
- const [key, val] = parse_media_upload_form_fields(i);
- acc[key] = val;
- return acc;
- }, {});
- const schema = MediaUploadSchema;
- const parsed_schema = schema.safeParse(fields_r);
- if (!parsed_schema.success) return parsed_schema.error.issues.map(i => i.message);
- else return {
- ...parsed_schema.data
- };
- }
- public async media_upload_add(opts: IMediaUploadAdd): Promise<IMediaUploadAddResolve<IClientDatabaseMessage>> {
- const err_s = this.media_upload_add_validate(opts);
- if (Array.isArray(err_s)) return { err_s };
- const fields = this.filter_bind_value_fields(Object.entries(err_s));
- if (!fields.length) return err_msg("*-fields");
+ public async nostr_relay_delete(args: INostrRelayDelete): Promise<INostrRelayDeleteResolve<IClientTauriDatabaseMessage>> {
try {
- const response = await invoke<any>("model_media_upload_add", { opts });
- if ("id" in response && typeof response.id === "string") return { id: response.id };
- else if (typeof response === "string") return err_msg(response);
+ const response = await invoke<any>("model_nostr_relay_delete", { args } satisfies INostrRelayDeleteHandler);
+ if (is_err_response(response)) return err_msg(response.err);
+ else if (is_pass_response(response)) return { pass: true };
return err_msg("*-result");
} catch (e) {
- return this.handle_errors("model_media_upload_add", opts, e);
+ return this.handle_errors("model_nostr_relay_delete", args, e);
};
}
- public async media_upload_get(opts: IMediaUploadGet): Promise<IMediaUploadGetResolve<IClientDatabaseMessage>> {
+ public async media_image_create(opts: IMediaImageCreate): Promise<IMediaImageCreateResolve<IClientTauriDatabaseMessage>> {
try {
- const response = await invoke<any>("model_media_upload_get", { opts: "list" in opts ? { list: { of: parse_media_upload_get_composite_list(opts.list), sort: opts.sort } } : { on: opts } });
- if (typeof response === "string") return err_msg(response);
- else if ("results" in response && Array.isArray(response.results)) return { results: parse_media_upload_list(response.results) };
+ const args = media_image_validate_form_fields(opts);
+ if (Array.isArray(args)) return { err_s: args };
+ const response = await invoke<any>("model_media_image_create", { args } satisfies IMediaImageCreateHandler);
+ if (is_err_response(response)) return err_msg(response.err);
+ else if (is_result_response(response)) return { id: response.result };
return err_msg("*-result");
} catch (e) {
- return this.handle_errors("model_media_upload_get", opts, e);
+ return this.handle_errors("model_media_image_create", opts, e);
};
}
- public async media_upload_get_one(opts: IMediaUploadGetOne): Promise<IMediaUploadGetOneResolve<IClientDatabaseMessage>> {
+ public async media_image_read(opts: IMediaImageRead): Promise<IMediaImageReadResolve<IClientTauriDatabaseMessage>> {
try {
- const response = await invoke<any>("model_media_upload_get", { opts: { on: opts } });
- if (typeof response === "string") return err_msg(response);
- else if ("results" in response && Array.isArray(response.results) && response.results.length === 1) {
- const result = parse_media_upload(response.results[0]);
+ const args = media_image_parse_select_query(opts);
+ const response = await invoke<any>("model_media_image_read", { args } satisfies IMediaImageReadHandler);
+ if (is_err_response(response)) return err_msg(response.err);
+ else if (is_results_response(response)) {
+ const result = media_image_parse(response.results[0]);
if (result) return { result };
}
return err_msg("*-result");
} catch (e) {
- return this.handle_errors("model_media_upload_get", opts, e);
+ return this.handle_errors("model_media_image_read", opts, e);
};
}
- public async media_upload_delete(opts: IMediaUploadDelete): Promise<IMediaUploadDeleteResolve<IClientDatabaseMessage>> {
+ public async media_image_read_list(opts?: IMediaImageReadList): Promise<IMediaImageReadListResolve<IClientTauriDatabaseMessage>> {
try {
- const response = await invoke<any>("model_media_upload_delete", { opts });
- if (response === null) return { pass: true };
- else if (typeof response === "string") return err_msg(response);
+ const args = media_image_parse_select_query_list(opts);
+ const response = await invoke<any>("model_media_image_read_list", { args } satisfies IMediaImageReadListHandler);
+ if (is_err_response(response)) return err_msg(response.err);
+ else if (is_results_response(response)) {
+ const results = media_image_parse_list(response.results);
+ if (results.length) return { results };
+ }
return err_msg("*-result");
} catch (e) {
- return this.handle_errors("model_media_upload_delete", opts, e);
- };
- }
- private media_upload_update_validate(fields: Partial<MediaUploadFormFields>): Partial<MediaUploadFields> | string[] {
- const fields_r = Object.entries(fields).filter(([_, v]) => !!v).reduce((acc: Record<string, IModelsQueryValue>, i) => {
- const [key, val] = parse_media_upload_form_fields(i);
- acc[key] = val;
- return acc;
- }, {});
- const schema = MediaUploadUpdateSchema;
- const parsed_schema = schema.safeParse(fields_r);
- if (!parsed_schema.success) return parsed_schema.error.issues.map(i => i.message);
- else return {
- ...parsed_schema.data
+ return this.handle_errors("model_media_image_read_list", opts, e);
};
}
- public async media_upload_update(opts: IMediaUploadUpdate): Promise<IMediaUploadUpdateResolve<IClientDatabaseMessage>> {
- const err_s = this.media_upload_update_validate(opts.fields);
- if (Array.isArray(err_s)) return { err_s };
- const fields = this.filter_bind_value_fields(Object.entries(err_s));
- if (!fields.length) return err_msg("*-fields");
+ public async media_image_update(opts: IMediaImageUpdate): Promise<IMediaImageUpdateResolve<IClientTauriDatabaseMessage>> {
try {
- const response = await invoke<any>("model_media_upload_update", { opts });
- if (response === null) return { pass: true };
- else if (typeof response === "string") return err_msg(response);
+ const fields = media_image_validate_update_form_fields(opts.fields);
+ if (Array.isArray(fields)) return { err_s: fields };
+ const args = media_image_parse_update_query(opts.filter, fields);
+ const response = await invoke<any>("model_media_image_update", { args } satisfies IMediaImageUpdateHandler);
+ if (is_err_response(response)) return err_msg(response.err);
+ else if (is_pass_response(response)) return { pass: true };
return err_msg("*-result");
} catch (e) {
- return this.handle_errors("model_media_upload_update", opts, e);
- };
- }
- private log_error_add_validate(fields: LogErrorFormFields): LogErrorFields | string[] {
- const fields_r = Object.entries(fields).filter(([_, v]) => !!v).reduce((acc: Record<string, IModelsQueryValue>, i) => {
- const [key, val] = parse_log_error_form_fields(i);
- acc[key] = val;
- return acc;
- }, {});
- const schema = LogErrorSchema;
- const parsed_schema = schema.safeParse(fields_r);
- if (!parsed_schema.success) return parsed_schema.error.issues.map(i => i.message);
- else return {
- ...parsed_schema.data
+ return this.handle_errors("model_media_image_update", opts, e);
};
}
- public async log_error_add(opts: ILogErrorAdd): Promise<ILogErrorAddResolve<IClientDatabaseMessage>> {
- const err_s = this.log_error_add_validate(opts);
- if (Array.isArray(err_s)) return { err_s };
- const fields = this.filter_bind_value_fields(Object.entries(err_s));
- if (!fields.length) return err_msg("*-fields");
+ public async media_image_delete(args: IMediaImageDelete): Promise<IMediaImageDeleteResolve<IClientTauriDatabaseMessage>> {
try {
- const response = await invoke<any>("model_log_error_add", { opts });
- if ("id" in response && typeof response.id === "string") return { id: response.id };
- else if (typeof response === "string") return err_msg(response);
+ const response = await invoke<any>("model_media_image_delete", { args } satisfies IMediaImageDeleteHandler);
+ if (is_err_response(response)) return err_msg(response.err);
+ else if (is_pass_response(response)) return { pass: true };
return err_msg("*-result");
} catch (e) {
- return this.handle_errors("model_log_error_add", opts, e);
+ return this.handle_errors("model_media_image_delete", args, e);
};
}
- public async log_error_get(opts: ILogErrorGet): Promise<ILogErrorGetResolve<IClientDatabaseMessage>> {
+ public async log_error_create(opts: ILogErrorCreate): Promise<ILogErrorCreateResolve<IClientTauriDatabaseMessage>> {
try {
- const response = await invoke<any>("model_log_error_get", { opts: "list" in opts ? { list: { of: parse_log_error_get_composite_list(opts.list), sort: opts.sort } } : { on: opts } });
- if (typeof response === "string") return err_msg(response);
- else if ("results" in response && Array.isArray(response.results)) return { results: parse_log_error_list(response.results) };
+ const args = log_error_validate_form_fields(opts);
+ if (Array.isArray(args)) return { err_s: args };
+ const response = await invoke<any>("model_log_error_create", { args } satisfies ILogErrorCreateHandler);
+ if (is_err_response(response)) return err_msg(response.err);
+ else if (is_result_response(response)) return { id: response.result };
return err_msg("*-result");
} catch (e) {
- return this.handle_errors("model_log_error_get", opts, e);
+ return this.handle_errors("model_log_error_create", opts, e);
};
}
- public async log_error_get_one(opts: ILogErrorGetOne): Promise<ILogErrorGetOneResolve<IClientDatabaseMessage>> {
+ public async log_error_read(opts: ILogErrorRead): Promise<ILogErrorReadResolve<IClientTauriDatabaseMessage>> {
try {
- const response = await invoke<any>("model_log_error_get", { opts: { on: opts } });
- if (typeof response === "string") return err_msg(response);
- else if ("results" in response && Array.isArray(response.results) && response.results.length === 1) {
- const result = parse_log_error(response.results[0]);
+ const args = log_error_parse_select_query(opts);
+ const response = await invoke<any>("model_log_error_read", { args } satisfies ILogErrorReadHandler);
+ if (is_err_response(response)) return err_msg(response.err);
+ else if (is_results_response(response)) {
+ const result = log_error_parse(response.results[0]);
if (result) return { result };
}
return err_msg("*-result");
} catch (e) {
- return this.handle_errors("model_log_error_get", opts, e);
+ return this.handle_errors("model_log_error_read", opts, e);
};
}
- public async log_error_delete(opts: ILogErrorDelete): Promise<ILogErrorDeleteResolve<IClientDatabaseMessage>> {
+ public async log_error_read_list(opts?: ILogErrorReadList): Promise<ILogErrorReadListResolve<IClientTauriDatabaseMessage>> {
try {
- const response = await invoke<any>("model_log_error_delete", { opts });
- if (response === null) return { pass: true };
- else if (typeof response === "string") return err_msg(response);
+ const args = log_error_parse_select_query_list(opts);
+ const response = await invoke<any>("model_log_error_read_list", { args } satisfies ILogErrorReadListHandler);
+ if (is_err_response(response)) return err_msg(response.err);
+ else if (is_results_response(response)) {
+ const results = log_error_parse_list(response.results);
+ if (results.length) return { results };
+ }
return err_msg("*-result");
} catch (e) {
- return this.handle_errors("model_log_error_delete", opts, e);
+ return this.handle_errors("model_log_error_read_list", opts, e);
};
}
- public async nostr_profile_relay_set(opts: INostrProfileRelayRelation): Promise<INostrProfileRelayRelationResolve<IClientDatabaseMessage>> {
+ public async log_error_update(opts: ILogErrorUpdate): Promise<ILogErrorUpdateResolve<IClientTauriDatabaseMessage>> {
try {
- const response = await invoke<any>("model_nostr_profile_relay_set", { opts });
- if (response === true) return { pass: true };
- else if (typeof response === "string") return err_msg(response);
+ const fields = log_error_validate_update_form_fields(opts.fields);
+ if (Array.isArray(fields)) return { err_s: fields };
+ const args = log_error_parse_update_query(opts.filter, fields);
+ const response = await invoke<any>("model_log_error_update", { args } satisfies ILogErrorUpdateHandler);
+ if (is_err_response(response)) return err_msg(response.err);
+ else if (is_pass_response(response)) return { pass: true };
return err_msg("*-result");
} catch (e) {
- return this.handle_errors("model_nostr_profile_relay_set", opts, e);
+ return this.handle_errors("model_log_error_update", opts, e);
};
- };
+ }
- public async nostr_profile_relay_unset(opts: INostrProfileRelayRelation): Promise<INostrProfileRelayRelationResolve<IClientDatabaseMessage>> {
- try {
- const response = await invoke<any>("model_nostr_profile_relay_unset", { opts });
- if (response === true) return { pass: true };
- else if (typeof response === "string") return err_msg(response);
- return err_msg("*-result");
- } catch (e) {
- return this.handle_errors("model_nostr_profile_relay_unset", opts, e);
- };
- };
-
- public async nostr_profile_relay_get_all(): Promise<INostrProfileRelayRelationResolveGetAll<IClientDatabaseMessage>> {
+ public async log_error_delete(args: ILogErrorDelete): Promise<ILogErrorDeleteResolve<IClientTauriDatabaseMessage>> {
try {
- const response = await invoke<any>("model_nostr_profile_relay_get_all");
- if (typeof response === "string") return err_msg(response);
- else if ("results" in response && Array.isArray(response.results)) return { results: parse_nostr_profile_relay_list(response.results) };
+ const response = await invoke<any>("model_log_error_delete", { args } satisfies ILogErrorDeleteHandler);
+ if (is_err_response(response)) return err_msg(response.err);
+ else if (is_pass_response(response)) return { pass: true };
return err_msg("*-result");
} catch (e) {
- return this.handle_errors("model_nostr_profile_relay_get_all", undefined, e);
+ return this.handle_errors("model_log_error_delete", args, e);
};
- };
+ }
- public async trade_product_location_set(opts: ITradeProductLocationRelation): Promise<ITradeProductLocationRelationResolve<IClientDatabaseMessage>> {
+ public async nostr_profile_relay_set(args: INostrProfileRelayRelation): Promise<INostrProfileRelayResolve<IClientTauriDatabaseMessage>> {
try {
- const response = await invoke<any>("model_trade_product_location_set", { opts });
+ const response = await invoke<any>("model_nostr_profile_relay_set", { args });
if (response === true) return { pass: true };
else if (typeof response === "string") return err_msg(response);
return err_msg("*-result");
} catch (e) {
- return this.handle_errors("model_trade_product_location_set", opts, e);
+ return this.handle_errors("model_nostr_profile_relay_set", args, e);
};
- };
+ }
- public async trade_product_location_unset(opts: ITradeProductLocationRelation): Promise<ITradeProductLocationRelationResolve<IClientDatabaseMessage>> {
+ public async nostr_profile_relay_unset(args: INostrProfileRelayRelation): Promise<INostrProfileRelayResolve<IClientTauriDatabaseMessage>> {
try {
- const response = await invoke<any>("model_trade_product_location_unset", { opts });
+ const response = await invoke<any>("model_nostr_profile_relay_unset", { args });
if (response === true) return { pass: true };
else if (typeof response === "string") return err_msg(response);
return err_msg("*-result");
} catch (e) {
- return this.handle_errors("model_trade_product_location_unset", opts, e);
+ return this.handle_errors("model_nostr_profile_relay_unset", args, e);
};
- };
-
- public async trade_product_location_get_all(): Promise<ITradeProductLocationRelationResolveGetAll<IClientDatabaseMessage>> {
+ }
+
+ public async trade_product_location_set(args: ITradeProductLocationRelation): Promise<ITradeProductLocationResolve<IClientTauriDatabaseMessage>> {
try {
- const response = await invoke<any>("model_trade_product_location_get_all");
- if (typeof response === "string") return err_msg(response);
- else if ("results" in response && Array.isArray(response.results)) return { results: parse_trade_product_location_list(response.results) };
+ const response = await invoke<any>("model_trade_product_location_set", { args });
+ if (response === true) return { pass: true };
+ else if (typeof response === "string") return err_msg(response);
return err_msg("*-result");
} catch (e) {
- return this.handle_errors("model_trade_product_location_get_all", undefined, e);
+ return this.handle_errors("model_trade_product_location_set", args, e);
};
- };
+ }
- public async trade_product_media_set(opts: ITradeProductMediaRelation): Promise<ITradeProductMediaRelationResolve<IClientDatabaseMessage>> {
+ public async trade_product_location_unset(args: ITradeProductLocationRelation): Promise<ITradeProductLocationResolve<IClientTauriDatabaseMessage>> {
try {
- const response = await invoke<any>("model_trade_product_media_set", { opts });
+ const response = await invoke<any>("model_trade_product_location_unset", { args });
if (response === true) return { pass: true };
else if (typeof response === "string") return err_msg(response);
return err_msg("*-result");
} catch (e) {
- return this.handle_errors("model_trade_product_media_set", opts, e);
+ return this.handle_errors("model_trade_product_location_unset", args, e);
};
- };
+ }
- public async trade_product_media_unset(opts: ITradeProductMediaRelation): Promise<ITradeProductMediaRelationResolve<IClientDatabaseMessage>> {
+ public async trade_product_media_set(args: ITradeProductMediaRelation): Promise<ITradeProductMediaResolve<IClientTauriDatabaseMessage>> {
try {
- const response = await invoke<any>("model_trade_product_media_unset", { opts });
+ const response = await invoke<any>("model_trade_product_media_set", { args });
if (response === true) return { pass: true };
else if (typeof response === "string") return err_msg(response);
return err_msg("*-result");
} catch (e) {
- return this.handle_errors("model_trade_product_media_unset", opts, e);
+ return this.handle_errors("model_trade_product_media_set", args, e);
};
- };
-
- public async trade_product_media_get_all(): Promise<ITradeProductMediaRelationResolveGetAll<IClientDatabaseMessage>> {
+ }
+
+ public async trade_product_media_unset(args: ITradeProductMediaRelation): Promise<ITradeProductMediaResolve<IClientTauriDatabaseMessage>> {
try {
- const response = await invoke<any>("model_trade_product_media_get_all");
- if (typeof response === "string") return err_msg(response);
- else if ("results" in response && Array.isArray(response.results)) return { results: parse_trade_product_media_list(response.results) };
+ const response = await invoke<any>("model_trade_product_media_unset", { args });
+ if (response === true) return { pass: true };
+ else if (typeof response === "string") return err_msg(response);
return err_msg("*-result");
} catch (e) {
- return this.handle_errors("model_trade_product_media_get_all", undefined, e);
+ return this.handle_errors("model_trade_product_media_unset", args, e);
};
- };
+ }
}
\ No newline at end of file
diff --git a/client/src/database/types.ts b/client/src/database/types.ts
@@ -1,41 +1,70 @@
-import type { ILocationGcsAdd, ILocationGcsAddResolve, ILocationGcsDelete, ILocationGcsDeleteResolve, ILocationGcsGet, ILocationGcsGetResolve, ILocationGcsUpdate, ILocationGcsUpdateResolve, ILogErrorAdd, ILogErrorAddResolve, ILogErrorDelete, ILogErrorDeleteResolve, ILogErrorGet, ILogErrorGetResolve, IMediaUploadAdd, IMediaUploadAddResolve, IMediaUploadDelete, IMediaUploadDeleteResolve, IMediaUploadGet, IMediaUploadGetResolve, IMediaUploadUpdate, IMediaUploadUpdateResolve, INostrProfileAdd, INostrProfileAddResolve, INostrProfileDelete, INostrProfileDeleteResolve, INostrProfileGet, INostrProfileGetResolve, INostrProfileRelayRelation, INostrProfileRelayRelationResolve, INostrProfileRelayRelationResolveGetAll, INostrProfileUpdate, INostrProfileUpdateResolve, INostrRelayAdd, INostrRelayAddResolve, INostrRelayDelete, INostrRelayDeleteResolve, INostrRelayGet, INostrRelayGetResolve, INostrRelayUpdate, INostrRelayUpdateResolve, ITradeProductAdd, ITradeProductAddResolve, ITradeProductDelete, ITradeProductDeleteResolve, ITradeProductGet, ITradeProductGetResolve, ITradeProductLocationRelation, ITradeProductLocationRelationResolve, ITradeProductLocationRelationResolveGetAll, ITradeProductMediaRelation, ITradeProductMediaRelationResolve, ITradeProductMediaRelationResolveGetAll, ITradeProductUpdate, ITradeProductUpdateResolve } from "@radroots/models";
+import { type ILocationGcsCreate, type ILocationGcsCreateResolve, type ILocationGcsDelete, type ILocationGcsDeleteResolve, type ILocationGcsRead, type ILocationGcsReadList, type ILocationGcsReadListResolve, type ILocationGcsReadResolve, type ILocationGcsUpdate, type ILocationGcsUpdateResolve, type ILogErrorCreate, type ILogErrorCreateResolve, type ILogErrorDelete, type ILogErrorDeleteResolve, type ILogErrorRead, type ILogErrorReadList, type ILogErrorReadListResolve, type ILogErrorReadResolve, type ILogErrorUpdate, type ILogErrorUpdateResolve, type IMediaImageCreate, type IMediaImageCreateResolve, type IMediaImageDelete, type IMediaImageDeleteResolve, type IMediaImageRead, type IMediaImageReadList, type IMediaImageReadListResolve, type IMediaImageReadResolve, type IMediaImageUpdate, type IMediaImageUpdateResolve, type INostrProfileCreate, type INostrProfileCreateResolve, type INostrProfileDelete, type INostrProfileDeleteResolve, type INostrProfileRead, type INostrProfileReadList, type INostrProfileReadListResolve, type INostrProfileReadResolve, type INostrProfileUpdate, type INostrProfileUpdateResolve, type INostrRelayCreate, type INostrRelayCreateResolve, type INostrRelayDelete, type INostrRelayDeleteResolve, type INostrRelayRead, type INostrRelayReadList, type INostrRelayReadListResolve, type INostrRelayReadResolve, type INostrRelayUpdate, type INostrRelayUpdateResolve, type ITradeProductCreate, type ITradeProductCreateResolve, type ITradeProductDelete, type ITradeProductDeleteResolve, type ITradeProductRead, type ITradeProductReadList, type ITradeProductReadListResolve, type ITradeProductReadResolve, type ITradeProductUpdate, type ITradeProductUpdateResolve } from "@radroots/models";
+import type { IClientDatabase } from "@radroots/utils";
-export type IClientDatabaseMessage =
+export type IClientTauriDatabaseMessage =
| string
| "*-fields"
| "*-result";
-export type IClientDatabase = {
- location_gcs_add(opts: ILocationGcsAdd): Promise<ILocationGcsAddResolve<IClientDatabaseMessage>>;
- location_gcs_get(opts: ILocationGcsGet): Promise<ILocationGcsGetResolve<IClientDatabaseMessage>>;
- location_gcs_delete(opts: ILocationGcsDelete): Promise<ILocationGcsDeleteResolve<IClientDatabaseMessage>>;
- location_gcs_update(opts: ILocationGcsUpdate): Promise<ILocationGcsUpdateResolve<IClientDatabaseMessage>>;
- trade_product_add(opts: ITradeProductAdd): Promise<ITradeProductAddResolve<IClientDatabaseMessage>>;
- trade_product_get(opts: ITradeProductGet): Promise<ITradeProductGetResolve<IClientDatabaseMessage>>;
- trade_product_delete(opts: ITradeProductDelete): Promise<ITradeProductDeleteResolve<IClientDatabaseMessage>>;
- trade_product_update(opts: ITradeProductUpdate): Promise<ITradeProductUpdateResolve<IClientDatabaseMessage>>;
- nostr_profile_add(opts: INostrProfileAdd): Promise<INostrProfileAddResolve<IClientDatabaseMessage>>;
- nostr_profile_get(opts: INostrProfileGet): Promise<INostrProfileGetResolve<IClientDatabaseMessage>>;
- nostr_profile_delete(opts: INostrProfileDelete): Promise<INostrProfileDeleteResolve<IClientDatabaseMessage>>;
- nostr_profile_update(opts: INostrProfileUpdate): Promise<INostrProfileUpdateResolve<IClientDatabaseMessage>>;
- nostr_relay_add(opts: INostrRelayAdd): Promise<INostrRelayAddResolve<IClientDatabaseMessage>>;
- nostr_relay_get(opts: INostrRelayGet): Promise<INostrRelayGetResolve<IClientDatabaseMessage>>;
- nostr_relay_delete(opts: INostrRelayDelete): Promise<INostrRelayDeleteResolve<IClientDatabaseMessage>>;
- nostr_relay_update(opts: INostrRelayUpdate): Promise<INostrRelayUpdateResolve<IClientDatabaseMessage>>;
- media_upload_add(opts: IMediaUploadAdd): Promise<IMediaUploadAddResolve<IClientDatabaseMessage>>;
- media_upload_get(opts: IMediaUploadGet): Promise<IMediaUploadGetResolve<IClientDatabaseMessage>>;
- media_upload_delete(opts: IMediaUploadDelete): Promise<IMediaUploadDeleteResolve<IClientDatabaseMessage>>;
- media_upload_update(opts: IMediaUploadUpdate): Promise<IMediaUploadUpdateResolve<IClientDatabaseMessage>>;
- log_error_add(opts: ILogErrorAdd): Promise<ILogErrorAddResolve<IClientDatabaseMessage>>;
- log_error_get(opts: ILogErrorGet): Promise<ILogErrorGetResolve<IClientDatabaseMessage>>;
- log_error_delete(opts: ILogErrorDelete): Promise<ILogErrorDeleteResolve<IClientDatabaseMessage>>;
- nostr_profile_relay_set(opts: INostrProfileRelayRelation): Promise<INostrProfileRelayRelationResolve<IClientDatabaseMessage>>;
- nostr_profile_relay_unset(opts: INostrProfileRelayRelation): Promise<INostrProfileRelayRelationResolve<IClientDatabaseMessage>>;
- nostr_profile_relay_get_all(opts: INostrProfileRelayRelation): Promise<INostrProfileRelayRelationResolveGetAll<IClientDatabaseMessage>>;
- trade_product_location_set(opts: ITradeProductLocationRelation): Promise<ITradeProductLocationRelationResolve<IClientDatabaseMessage>>;
- trade_product_location_unset(opts: ITradeProductLocationRelation): Promise<ITradeProductLocationRelationResolve<IClientDatabaseMessage>>;
- trade_product_location_get_all(opts: ITradeProductLocationRelation): Promise<ITradeProductLocationRelationResolveGetAll<IClientDatabaseMessage>>;
- trade_product_media_set(opts: ITradeProductMediaRelation): Promise<ITradeProductMediaRelationResolve<IClientDatabaseMessage>>;
- trade_product_media_unset(opts: ITradeProductMediaRelation): Promise<ITradeProductMediaRelationResolve<IClientDatabaseMessage>>;
- trade_product_media_get_all(opts: ITradeProductMediaRelation): Promise<ITradeProductMediaRelationResolveGetAll<IClientDatabaseMessage>>;
-};
-\ No newline at end of file
+export type IClientTauriDatabase = IClientDatabase<
+ ILocationGcsCreate,
+ ILocationGcsCreateResolve<IClientTauriDatabaseMessage>,
+ ILocationGcsRead,
+ ILocationGcsReadResolve<IClientTauriDatabaseMessage>,
+ ILocationGcsReadList,
+ ILocationGcsReadListResolve<IClientTauriDatabaseMessage>,
+ ILocationGcsDelete,
+ ILocationGcsDeleteResolve<IClientTauriDatabaseMessage>,
+ ILocationGcsUpdate,
+ ILocationGcsUpdateResolve<IClientTauriDatabaseMessage>,
+ ITradeProductCreate,
+ ITradeProductCreateResolve<IClientTauriDatabaseMessage>,
+ ITradeProductRead,
+ ITradeProductReadResolve<IClientTauriDatabaseMessage>,
+ ITradeProductReadList,
+ ITradeProductReadListResolve<IClientTauriDatabaseMessage>,
+ ITradeProductDelete,
+ ITradeProductDeleteResolve<IClientTauriDatabaseMessage>,
+ ITradeProductUpdate,
+ ITradeProductUpdateResolve<IClientTauriDatabaseMessage>,
+ INostrProfileCreate,
+ INostrProfileCreateResolve<IClientTauriDatabaseMessage>,
+ INostrProfileRead,
+ INostrProfileReadResolve<IClientTauriDatabaseMessage>,
+ INostrProfileReadList,
+ INostrProfileReadListResolve<IClientTauriDatabaseMessage>,
+ INostrProfileDelete,
+ INostrProfileDeleteResolve<IClientTauriDatabaseMessage>,
+ INostrProfileUpdate,
+ INostrProfileUpdateResolve<IClientTauriDatabaseMessage>,
+ INostrRelayCreate,
+ INostrRelayCreateResolve<IClientTauriDatabaseMessage>,
+ INostrRelayRead,
+ INostrRelayReadResolve<IClientTauriDatabaseMessage>,
+ INostrRelayReadList,
+ INostrRelayReadListResolve<IClientTauriDatabaseMessage>,
+ INostrRelayDelete,
+ INostrRelayDeleteResolve<IClientTauriDatabaseMessage>,
+ INostrRelayUpdate,
+ INostrRelayUpdateResolve<IClientTauriDatabaseMessage>,
+ IMediaImageCreate,
+ IMediaImageCreateResolve<IClientTauriDatabaseMessage>,
+ IMediaImageRead,
+ IMediaImageReadResolve<IClientTauriDatabaseMessage>,
+ IMediaImageReadList,
+ IMediaImageReadListResolve<IClientTauriDatabaseMessage>,
+ IMediaImageDelete,
+ IMediaImageDeleteResolve<IClientTauriDatabaseMessage>,
+ IMediaImageUpdate,
+ IMediaImageUpdateResolve<IClientTauriDatabaseMessage>,
+ ILogErrorCreate,
+ ILogErrorCreateResolve<IClientTauriDatabaseMessage>,
+ ILogErrorRead,
+ ILogErrorReadResolve<IClientTauriDatabaseMessage>,
+ ILogErrorReadList,
+ ILogErrorReadListResolve<IClientTauriDatabaseMessage>,
+ ILogErrorDelete,
+ ILogErrorDeleteResolve<IClientTauriDatabaseMessage>,
+ ILogErrorUpdate,
+ ILogErrorUpdateResolve<IClientTauriDatabaseMessage>
+>;
diff --git a/client/src/datastore/tauri.ts b/client/src/datastore/tauri.ts
@@ -0,0 +1,63 @@
+import { ds_map, ds_map_param, err_msg, type IClientDatastore, type IClientDatastoreEntriesResolve, type IClientDatastoreGetPResolve, type IClientDatastoreGetResolve, type IClientDatastoreKeysResolve, type IClientDatastoreRemoveResolve, type IClientDatastoreSetPResolve, type IClientDatastoreSetResolve } from '@radroots/utils';
+import { load, Store } from '@tauri-apps/plugin-store';
+
+export class TauriClientDatastore implements IClientDatastore {
+ private _store: Store | null = null;
+ private _store_path: string;
+
+ constructor(store_path: string = 'radroots_datastore.json') {
+ this._store_path = store_path;
+ }
+
+ public async init(): Promise<void> {
+ this._store = await load(this._store_path);
+ }
+
+ public async set(key: keyof typeof ds_map, value: string): Promise<IClientDatastoreSetResolve> {
+ if (!this._store) return err_msg(`*-store`);
+ await this._store.set(ds_map[key], { value });
+ await this._store.save();
+ return { pass: true };
+ }
+
+ public async get(key: keyof typeof ds_map): Promise<IClientDatastoreGetResolve> {
+ if (!this._store) return err_msg(`*-store`);
+ const result = await this._store.get<{ value: any }>(ds_map[key]);
+ if (result && typeof result.value === `string`) return { result: result.value };
+ return err_msg(`*-result`);
+ }
+
+ public async setp(key: keyof typeof ds_map_param, key_param: string, value: string): Promise<IClientDatastoreSetPResolve> {
+ if (!this._store) return err_msg(`*-store`);
+ await this._store.set(ds_map_param[key](key_param), { value });
+ await this._store.save();
+ return { pass: true };
+ }
+
+ public async getp(key: keyof typeof ds_map_param, key_param: string): Promise<IClientDatastoreGetPResolve> {
+ if (!this._store) return err_msg(`*-store`);
+ const result = await this._store.get<{ value: any }>(ds_map_param[key](key_param));
+ if (result && typeof result.value === `string`) return { result: result.value };
+ return err_msg(`*-result`);
+ }
+
+ public async remove(key: keyof typeof ds_map): Promise<IClientDatastoreRemoveResolve> {
+ if (!this._store) return err_msg(`*-store`);
+ const res = await this._store.delete(ds_map[key]);
+ if (!res) return err_msg(`*-pass`);
+ await this._store.save();
+ return { pass: true };
+ }
+
+ public async keys(): Promise<IClientDatastoreKeysResolve> {
+ if (!this._store) return err_msg(`*-store`);
+ const results = await this._store.keys();
+ return { results };
+ }
+
+ public async entries(): Promise<IClientDatastoreEntriesResolve> {
+ if (!this._store) return err_msg(`*-store`);
+ const results = await this._store.entries();
+ return { results };
+ }
+}
diff --git a/client/src/device/tauri.ts b/client/src/device/tauri.ts
@@ -1,26 +0,0 @@
-import { app } from '@tauri-apps/api';
-import type { IClientDevice, IClientDeviceMetadata } from "./types";
-
-export class TauriClientDevice implements IClientDevice {
- private _metadata: IClientDeviceMetadata | undefined = undefined;
-
- public async init(opts: IClientDeviceMetadata): Promise<void> {
- this._metadata = opts;
- }
-
- public get metadata() {
- return this._metadata;
- }
-
- public async get_name(): Promise<string> {
- return await app.getName();
- }
-
- public async get_version(): Promise<string> {
- return await app.getVersion();
- }
-
- //public async set_theme(theme: `light` | `dark`) {
- // return app.setTheme(theme);
- //}
-}
diff --git a/client/src/device/types.ts b/client/src/device/types.ts
@@ -1,11 +0,0 @@
-export type IClientDeviceMetadata = {
- version: string;
- platform: string;
- locale: string;
-};
-
-export type IClientDevice = {
- init(opts: IClientDeviceMetadata): Promise<void>;
- get_name(): Promise<string>;
- get_version(): Promise<string>;
-};
-\ No newline at end of file
diff --git a/client/src/dialog/tauri.ts b/client/src/dialog/tauri.ts
@@ -1,49 +0,0 @@
-import { confirm, type ConfirmDialogOptions, message, open, type OpenDialogOptions } from '@tauri-apps/plugin-dialog';
-import type { IClientDialog, IClientDialogConfirmOpts, IClientDialogKind, IClientDialogResolve } from "./types";
-
-export class TauriClientDialog implements IClientDialog {
- public async alert(opts: string, title?: string, kind?: IClientDialogKind): Promise<boolean> {
- try {
- await message(opts, { title: title || ``, kind: kind || `info` });
- return true;
- } catch (e) {
- return false;
- };
- }
-
- public async confirm(opts: IClientDialogConfirmOpts): Promise<boolean> {
- try {
- const msg = typeof opts === `string` ? opts : opts.message;
- const options: ConfirmDialogOptions = { title: `` };
- if (typeof opts !== `string`) {
- options.title = opts.title || ``;
- options.kind = opts.kind || `info`;
- if (opts.cancel_label) options.cancelLabel = opts.cancel_label;
- if (opts.ok_label) options.okLabel = opts.ok_label;
- }
- const res = await confirm(msg, options);
- return res;
- } catch (e) {
- return false;
- };
- }
-
- public async open_photos(): Promise<IClientDialogResolve | undefined> {
- try {
- const options: OpenDialogOptions = {
- multiple: true,
- directory: false,
- filters: [{
- name: `Image`,
- extensions: ['png']
- }]
- };
- const res = await open(options) as any;
- if (Array.isArray(res)) return { results: res.map(i => String(i)) };
- else if (typeof res === `string`) return { results: [res] };
- return undefined;
- } catch (e) {
- return undefined;
- };
- }
-}
diff --git a/client/src/dialog/types.ts b/client/src/dialog/types.ts
@@ -1,25 +0,0 @@
-import type { ResultsList } from "@radroots/utils";
-
-export type IClientDialogPrompt = {
- title?: string;
- message: string;
- ok_button_title?: string;
- cancel_button_title?: string;
- input_placeholder?: string;
- input_text?: string;
-};
-
-export type IClientDialogKind = "info" | "warning" | "error";
-
-export type IClientDialogAlertOpts = string;
-
-export type IClientDialogConfirmOpts = string | { title?: string, kind?: IClientDialogKind; message: string; cancel_label?: string; ok_label?: string; };
-
-export type IClientDialogResolve = ResultsList<string>;
-
-export type IClientDialog = {
- alert(opts: IClientDialogAlertOpts): Promise<boolean>;
- confirm(opts: IClientDialogConfirmOpts): Promise<boolean>;
- open_photos(): Promise<IClientDialogResolve | undefined>;
- //prompt(opts: IClientDialogPrompt): Promise<string | false>;
-};
-\ No newline at end of file
diff --git a/client/src/fs/tauri.ts b/client/src/fs/tauri.ts
@@ -1,44 +1,24 @@
import { BaseDirectory, exists, open, readFile, stat } from '@tauri-apps/plugin-fs';
-import type { IClientFs, IClientFsFileInfo, IClientFsOpenResult } from "./types";
+import type { IClientFs, IClientFsExistsResolve, IClientFsInfoResolve, IClientFsOpenResolve, IClientFsReadBinResolve } from "./types";
export class TauriClientFs implements IClientFs {
- public async exists(path: string): Promise<boolean> {
- try {
- const res = await exists(path, { baseDir: BaseDirectory.AppData });
- return res;
- } catch (e) {
- console.log(`e exists`, e)
- return false;
- };
+ public async exists(path: string): Promise<IClientFsExistsResolve> {
+ const res = await exists(path, { baseDir: BaseDirectory.AppData });
+ return res;
}
- public async open(path: string): Promise<IClientFsOpenResult | undefined> {
- try {
- const res = await open(path, { read: true, baseDir: BaseDirectory.AppData });
- return res;
- } catch (e) {
- console.log(`e open`, e)
- return undefined;
- };
+ public async open(path: string): Promise<IClientFsOpenResolve> {
+ const res = await open(path, { read: true, baseDir: BaseDirectory.AppData });
+ return res;
}
- public async read_bin(path: string): Promise<Uint8Array | undefined> {
- try {
- const res = await readFile(path, { baseDir: BaseDirectory.AppData });
- return res;
- } catch (e) {
- console.log(`e read_bin`, e)
- return undefined;
- };
+ public async read_bin(path: string): Promise<IClientFsReadBinResolve> {
+ const res = await readFile(path, { baseDir: BaseDirectory.AppData });
+ return res;
}
- public async info(path: string): Promise<IClientFsFileInfo | undefined> {
- try {
- const res = await stat(path, { baseDir: BaseDirectory.AppData });
- return res;
- } catch (e) {
- console.log(`e open`, e)
- return undefined;
- };
+ public async info(path: string): Promise<IClientFsInfoResolve> {
+ const res = await stat(path, { baseDir: BaseDirectory.AppData });
+ return res;
}
}
diff --git a/client/src/fs/types.ts b/client/src/fs/types.ts
@@ -4,9 +4,14 @@ export type IClientFsOpenResult = FileHandle;
export type IClientFsFileInfo = FileInfo;
+export type IClientFsExistsResolve = boolean;
+export type IClientFsOpenResolve = IClientFsOpenResult;
+export type IClientFsReadBinResolve = Uint8Array;
+export type IClientFsInfoResolve = IClientFsFileInfo;
+
export type IClientFs = {
- exists(path: string): Promise<boolean>;
- open(path: string): Promise<IClientFsOpenResult | undefined>;
- read_bin(path: string): Promise<Uint8Array | undefined>;
- info(path: string): Promise<IClientFsFileInfo | undefined>;
+ exists(path: string): Promise<IClientFsExistsResolve>;
+ open(path: string): Promise<IClientFsOpenResolve>;
+ read_bin(path: string): Promise<IClientFsReadBinResolve>;
+ info(path: string): Promise<IClientFsInfoResolve>;
};
\ No newline at end of file
diff --git a/client/src/geolocation/tauri.ts b/client/src/geolocation/tauri.ts
@@ -1,27 +1,25 @@
-import { err_msg, handle_error, type ErrorMessage } from '@radroots/utils';
+import { err_msg, handle_error, parse_geol_coords, type ErrorMessage, type IClientGeolocation, type IClientGeolocationPosition, type IGeolocationErrorMessage } from '@radroots/utils';
import {
checkPermissions,
getCurrentPosition,
requestPermissions,
- watchPosition,
+ type PermissionStatus,
type Position
} from '@tauri-apps/plugin-geolocation';
-import { parse_location_coords } from '../utils';
-import type { IClientGeolocation, IClientGeolocationPermission, IClientGeolocationPosition, IClientGeolocationWatchCallback, IClientGeolocationWatchOpts, IGeolocationErrorMessage } from './types';
export class TauriClientGeolocation implements IClientGeolocation {
- private parse_geolocation_position({ coords: pos_coords }: Position): IClientGeolocationPosition {
+ private parse_geolocation_position({ coords: geol_p }: Position): IClientGeolocationPosition {
const position: IClientGeolocationPosition = {
- lat: parse_location_coords(pos_coords.latitude),
- lng: parse_location_coords(pos_coords.longitude),
- accuracy: pos_coords.accuracy ?? undefined,
- altitude: pos_coords.altitude ?? undefined,
- altitude_accuracy: pos_coords.altitudeAccuracy ?? undefined
+ lat: parse_geol_coords(geol_p.latitude),
+ lng: parse_geol_coords(geol_p.longitude),
+ accuracy: geol_p.accuracy ?? undefined,
+ altitude: geol_p.altitude ?? undefined,
+ altitude_accuracy: geol_p.altitudeAccuracy ?? undefined
};
return position;
}
- private async request_permissions(): Promise<IClientGeolocationPermission> {
+ private async request_permissions(): Promise<PermissionStatus> {
return await requestPermissions(['location']);
}
@@ -32,41 +30,23 @@ export class TauriClientGeolocation implements IClientGeolocation {
const permission = await this.request_permissions();
if (permission.location !== `granted`) return false
};
- return true
+ return true;
} catch (e) {
console.log(`e has_permissions`, e);
return false;
}
}
-
public async current(): Promise<IClientGeolocationPosition | ErrorMessage<IGeolocationErrorMessage>> {
try {
if (!(await this.has_permissions())) return err_msg(`*-permissions`);
const position = await getCurrentPosition()
return this.parse_geolocation_position(position);
} catch (e) {
+ console.log(`e current`, e)
const { err } = handle_error(e);
if (err.includes(`The operation couldn’t be completed`)) return err_msg(`*-permissions`);
return err_msg(`*`);
};
}
-
- public async watch(opts: IClientGeolocationWatchOpts = {
- timeout: 10000,
- max_age: 0
- }, callback: IClientGeolocationWatchCallback): Promise<number | ErrorMessage<IGeolocationErrorMessage>> {
- try {
- if (!(await this.has_permissions())) return err_msg(`*-permissions`);
- const position_w = await watchPosition(
- { enableHighAccuracy: true, timeout: opts.timeout, maximumAge: opts.max_age },
- async (pos) => pos ? await callback(this.parse_geolocation_position(pos)) : null
- )
- return position_w;
- } catch (e) {
- const { err } = handle_error(e);
- if (err.includes(`The operation couldn’t be completed`)) err_msg(`*-permissions`);
- return err_msg(`*`);
- };
- }
}
diff --git a/client/src/geolocation/types.ts b/client/src/geolocation/types.ts
@@ -1,27 +0,0 @@
-import type { ErrorMessage } from "@radroots/utils";
-import {
- type PermissionStatus
-} from '@tauri-apps/plugin-geolocation';
-
-export type IClientGeolocationPermission = PermissionStatus;
-export type IGeolocationErrorMessage = `*-permissions` | `*`;
-
-export type IClientGeolocationPosition = {
- lat: number;
- lng: number;
- accuracy?: number;
- altitude?: number;
- altitude_accuracy?: number;
-};
-
-export type IClientGeolocationWatchOpts = {
- timeout: number;
- max_age: number;
-};
-
-export type IClientGeolocationWatchCallback = (pos: IClientGeolocationPosition | null) => Promise<void>;
-
-export type IClientGeolocation = {
- current(): Promise<IClientGeolocationPosition | ErrorMessage<IGeolocationErrorMessage>>;
- watch(opts: IClientGeolocationWatchOpts | undefined, callback: IClientGeolocationWatchCallback): Promise<number | ErrorMessage<IGeolocationErrorMessage>>
-};
-\ No newline at end of file
diff --git a/client/src/gui/tauri.ts b/client/src/gui/tauri.ts
@@ -0,0 +1,64 @@
+
+import { type IClientGui, type IClientGuiDialogConfirmOpts, type IClientGuiDialogKind, type IClientGuiDialogResolve, type IClientGuiNotifyPermission, type IClientGuiNotifySendOptions } from '@radroots/utils';
+import { confirm, type ConfirmDialogOptions, message, open, type OpenDialogOptions } from '@tauri-apps/plugin-dialog';
+import {
+ isPermissionGranted as isPermissionGrantedNotification,
+ type Options as NotificationsOptions,
+ requestPermission as requestPermissionNotification,
+ sendNotification
+} from '@tauri-apps/plugin-notification';
+
+export class TauriClientGui implements IClientGui {
+ public async alert(opts: string, title?: string, kind?: IClientGuiDialogKind): Promise<boolean> {
+ await message(opts, { title: title || ``, kind: kind || `info` });
+ return true;
+ }
+
+ public async confirm(opts: IClientGuiDialogConfirmOpts): Promise<boolean> {
+ const msg = typeof opts === `string` ? opts : opts.message;
+ const options: ConfirmDialogOptions = { title: `` };
+ if (typeof opts !== `string`) {
+ options.title = opts.title || ``;
+ options.kind = opts.kind || `info`;
+ if (opts.cancel) options.cancelLabel = opts.cancel;
+ if (opts.ok) options.okLabel = opts.ok;
+ }
+ return await confirm(msg, options);
+ }
+
+ public notify_init = async (): Promise<IClientGuiNotifyPermission | undefined> => {
+ return await requestPermissionNotification();
+ }
+
+ public notify_send = async (opts: string | IClientGuiNotifySendOptions): Promise<void> => {
+ if (!(await isPermissionGrantedNotification())) {
+ const permission = await this.notify_init();
+ if (permission !== 'granted') return;
+ };
+ const options: NotificationsOptions = typeof opts === `string` ? {
+ title: `Radroots`,
+ body: opts
+ } : {
+ id: opts.id,
+ channelId: opts.channel_id,
+ title: opts.title,
+ body: opts.body
+ };
+ sendNotification(options);
+ }
+
+ public async open_photos(): Promise<IClientGuiDialogResolve | undefined> {
+ const options: OpenDialogOptions = {
+ multiple: true,
+ directory: false,
+ filters: [{
+ name: `Image`,
+ extensions: ['png']
+ }]
+ };
+ const res = await open(options) as any;
+ if (Array.isArray(res)) return { results: res.map(i => String(i)) };
+ else if (typeof res === `string`) return { results: [res] };
+ return undefined;
+ }
+}
diff --git a/client/src/http/tauri.ts b/client/src/http/tauri.ts
@@ -1,7 +1,6 @@
-import { err_msg, type ErrorMessage, type FieldRecord } from '@radroots/utils';
-import { type ClientOptions, fetch } from '@tauri-apps/plugin-http';
-import type { IClientDeviceMetadata } from '../device/types';
-import type { IClientHttp, IClientHttpImageResponse, IClientHttpOpts, IClientHttpResponse } from './types';
+import { err_msg, http_fetch_opts, http_parse_response, type ErrorMessage, type FieldRecord, type IHttpImageResponse, type IHttpOpts, type IHttpResponse } from '@radroots/utils';
+import { fetch, type ClientOptions } from '@tauri-apps/plugin-http';
+import type { IClientHttp } from './types';
const parse_headers = (headers: Headers): FieldRecord => {
const acc: FieldRecord = {};
@@ -29,63 +28,33 @@ export class TauriClientHttp implements IClientHttp {
private _headers: FieldRecord;
constructor() {
- this._headers = {};
- }
-
- public async init(opts: IClientDeviceMetadata): Promise<void> {
this._headers = {
- "User-Agent": `radroots-app/0.0.0`,
- "X-Client-Version": opts.version,
- "X-Client-Platform": opts.platform,
- "X-Client-Locale": opts.locale,
+ "Content-Type": 'application/json',
+ "User-Agent": `radroots/1.0.0`,
+ "X-Radroots-Version": `radroots/*`,
};
}
- public async fetch(opts: IClientHttpOpts): Promise<IClientHttpResponse | ErrorMessage<string>> {
+ public async init(opts?: {
+ app_version?: string;
+ app_hash?: string;
+ }): Promise<void> {
+ if (opts?.app_version) this._headers["User-Agent"] = `radroots/${opts.app_version}`;
+ if (opts?.app_hash) this._headers["X-Radroots-Version"] = `radroots/${opts.app_hash}`;
+ }
+
+ public async fetch(opts: IHttpOpts): Promise<IHttpResponse | ErrorMessage<string>> {
try {
- const { url } = opts;
- const headers: FieldRecord = {
- ...this._headers,
- ...opts.headers,
- };
- if (opts.authorization) headers['Authorization'] = `Bearer ${encodeURIComponent(opts.authorization)}`;
- const options: RequestInit & ClientOptions = {
- method: opts.method ? opts.method.toUpperCase() : `GET`,
- headers,
- }
- if (opts.data) options.body = to_bodyinit(opts.data);
- if (opts.data_bin) options.body = opts.data_bin;
- if (opts.connect_timeout) options.connectTimeout = opts.connect_timeout;
+ const { url, options } = http_fetch_opts(opts);
const response = await fetch(url, options);
- let data: any = null;
- try {
- const res_json = await response.json();
- data = typeof res_json === `string` ? JSON.parse(res_json) : res_json;
- } catch { }
- if (!data) {
- try {
- const res_text = await response.text();
- data = res_text;
- } catch { }
- }
- return {
- status: response.status,
- url: response.url,
- data: response.ok ? data : null,
- error: !response.ok && `error` in data ? typeof data.error === `string` ? {
- message: data.error
- } : {
- ...data.error
- } : undefined,
- headers: parse_headers(response.headers)
- };
+ return http_parse_response(response);
} catch (e) {
console.log(`e fetch`, e)
return err_msg(String(e));
};
}
- public async fetch_image(url: string): Promise<IClientHttpImageResponse | ErrorMessage<string>> {
+ public async fetch_image(url: string): Promise<IHttpImageResponse | ErrorMessage<string>> {
try {
const headers: FieldRecord = {
...this._headers,
diff --git a/client/src/http/types.ts b/client/src/http/types.ts
@@ -1,40 +1,6 @@
-import type { ErrorMessage, FieldRecord } from "@radroots/utils";
-
-export type IClientHttpOpts = {
- url: string;
- method?: `get` | `post` | `put`;
- params?: {
- [key: string]: string | string[];
- };
- data?: Record<string, string | number | boolean>;
- data_bin?: Uint8Array;
- authorization?: string;
- headers?: FieldRecord;
- connect_timeout?: number;
-};
-
-export type IClientHttpImageResponse = {
- status: number;
- blob?: Blob;
- headers: FieldRecord;
- url: string;
-};
-
-export type IClientHttpResponseError = {
- message: string;
- label_ok?: string;
- label_cancel?: string;
-};
-
-export type IClientHttpResponse = {
- status: number;
- data: any;
- error?: IClientHttpResponseError;
- headers: FieldRecord;
- url: string;
-};
+import type { ErrorMessage, IHttpImageResponse, IHttpOpts, IHttpResponse } from "@radroots/utils";
export type IClientHttp = {
- fetch(opts: IClientHttpOpts): Promise<IClientHttpResponse | ErrorMessage<string>>;
- fetch_image(url: string): Promise<IClientHttpImageResponse | ErrorMessage<string>>;
+ fetch(opts: IHttpOpts): Promise<IHttpResponse | ErrorMessage<string>>;
+ fetch_image(url: string): Promise<IHttpImageResponse | ErrorMessage<string>>;
};
\ No newline at end of file
diff --git a/client/src/index.ts b/client/src/index.ts
@@ -1,29 +1,20 @@
export * from "./database/tauri"
export * from "./database/types"
-export * from "./device/tauri"
-export * from "./device/types"
-export * from "./dialog/tauri"
-export * from "./dialog/types"
+export * from "./datastore/tauri"
export * from "./fs/tauri"
export * from "./fs/types"
export * from "./geolocation/tauri"
-export * from "./geolocation/types"
+export * from "./gui/tauri"
export * from "./haptics/tauri"
export * from "./haptics/types"
export * from "./http/tauri"
export * from "./http/types"
-export * from "./keyring/tauri"
-export * from "./keyring/types"
-export * from "./keystore/tauri"
-export * from "./keystore/types"
-export * from "./logger/tauri"
-export * from "./logger/types"
-export * from "./notification/tauri"
-export * from "./notification/types"
-export * from "./os/tauri"
-export * from "./os/types"
+export * from "./keys/tauri"
+export * from "./keys/types"
+export * from "./lib"
+export * from "./radroots/tauri"
+export * from "./radroots/types"
export * from "./types"
-export * from "./utils"
-export * from "./window/tauri"
-export * from "./window/types"
+export * from "./util"
+
diff --git a/client/src/keyring/tauri.ts b/client/src/keyring/tauri.ts
@@ -1,26 +0,0 @@
-import { err_msg, type ErrorMessage } from '@radroots/utils';
-import { invoke } from "@tauri-apps/api/core";
-import type { IClientKeyring } from './types';
-
-export class TauriClientKeying implements IClientKeyring {
- public async set_nostr_key(secret_key_hex: string): Promise<true | ErrorMessage<string>> {
- try {
- const response = await invoke<any>("keyring_nostr_key_set", { secretKeyHex: secret_key_hex });
- console.log(`response set_nostr_key`, response)
- return true;
- } catch (e) {
- return err_msg(`*`);
- }
- }
-
- public async get_nostr_key(public_key_hex: string): Promise<{ result: string } | ErrorMessage<string>> {
- try {
- const response = await invoke<any>("keyring_nostr_key_get", { publicKeyHex: public_key_hex });
- console.log(`response `, response);
- if (response && typeof response === `string`) return { result: response };
- return err_msg(`*-result`);
- } catch (e) {
- return err_msg(`*`);
- }
- }
-}
diff --git a/client/src/keyring/types.ts b/client/src/keyring/types.ts
@@ -1,7 +0,0 @@
-import type { ErrorMessage } from "@radroots/utils";
-
-
-export type IClientKeyring = {
- set_nostr_key(key: string, val: string): Promise<true | ErrorMessage<string>>;
- get_nostr_key(key: string): Promise<{ result: string } | ErrorMessage<string>>;
-};
-\ No newline at end of file
diff --git a/client/src/keys/tauri.ts b/client/src/keys/tauri.ts
@@ -0,0 +1,72 @@
+
+import { err_msg, is_pass_response, is_result_response, is_results_response, lib_nostr_secret_key_validate } from '@radroots/utils';
+import { invoke } from '@tauri-apps/api/core';
+import type { IClientKeys, IClientKeysNostrAddResolve, IClientKeysNostrCreateResolve, IClientKeysNostrDeleteResolve, IClientKeysNostrKeystoreResetResolve, IClientKeysNostrReadAllResolve, IClientKeysNostrReadResolve } from './types';
+
+export class TaurIClientKeys implements IClientKeys {
+ private async command(cmd: string, opts?: any): Promise<any> {
+ return await invoke<any>(cmd, opts ? opts : undefined);
+ };
+
+ public nostr_gen = async (): Promise<IClientKeysNostrCreateResolve> => {
+ try {
+ const response = await this.command("keys_nostr_gen");
+ if (is_result_response(response)) return { public_key: response.result };
+ return err_msg(`*-result`);
+ } catch (e) {
+ return err_msg(`*`);
+ }
+ }
+
+ public nostr_add = async (nsec_or_hex: string): Promise<IClientKeysNostrAddResolve> => {
+ try {
+ const secret_key = lib_nostr_secret_key_validate(nsec_or_hex);
+ if (!secret_key) return err_msg(`*-key`);
+ const response = await this.command("keys_nostr_create", { secret_key });
+ if (is_result_response(response)) return { public_key: response.result };
+ return err_msg(`*-result`);
+ } catch (e) {
+ return err_msg(`*`);
+ }
+ }
+
+ public nostr_read = async (public_key: string): Promise<IClientKeysNostrReadResolve> => {
+ try {
+ const response = await this.command("keys_nostr_read", { public_key });
+ if (is_result_response(response)) return { secret_key: response.result };
+ return err_msg(`*-result`);
+ } catch (e) {
+ return err_msg(`*`);
+ }
+ }
+
+ public nostr_read_all = async (): Promise<IClientKeysNostrReadAllResolve> => {
+ try {
+ const response = await this.command("keys_nostr_read_all");
+ if (is_results_response(response)) return { results: response.results };
+ return err_msg(`*-result`);
+ } catch (e) {
+ return err_msg(`*`);
+ }
+ }
+
+ public nostr_delete = async (public_key: string): Promise<IClientKeysNostrDeleteResolve> => {
+ try {
+ const response = await this.command("keys_nostr_delete", { public_key });
+ if (is_pass_response(response)) return { pass: true };
+ return err_msg(`*-result`);
+ } catch (e) {
+ return err_msg(`*`);
+ }
+ }
+
+ public nostr_keystore_reset = async (): Promise<IClientKeysNostrKeystoreResetResolve> => {
+ try {
+ const response = await this.command("keys_nostr_keystore_reset");
+ if (is_pass_response(response)) return { pass: true };
+ return err_msg(`*`);
+ } catch (e) {
+ return err_msg(`*`);
+ }
+ }
+}
diff --git a/client/src/keys/types.ts b/client/src/keys/types.ts
@@ -0,0 +1,25 @@
+import type { ErrorMessage, ResultPass, ResultPublicKey, ResultSecretKey, ResultsList } from "@radroots/utils";
+
+export type ICoreDeviceMetadata = {
+ os_arch: string;
+ os_platform: string;
+ os_version: string;
+ app_name: string;
+ app_version: string;
+};
+
+export type IClientKeysNostrCreateResolve = ResultPublicKey | ErrorMessage<string>;
+export type IClientKeysNostrAddResolve = ResultPublicKey | ErrorMessage<string>;
+export type IClientKeysNostrReadResolve = ResultSecretKey | ErrorMessage<string>;
+export type IClientKeysNostrReadAllResolve = ResultsList<string> | ErrorMessage<string>;
+export type IClientKeysNostrDeleteResolve = ResultPass | ErrorMessage<string>;
+export type IClientKeysNostrKeystoreResetResolve = ResultPass | ErrorMessage<string>;
+
+export type IClientKeys = {
+ nostr_gen(): Promise<IClientKeysNostrCreateResolve>;
+ nostr_add(secret_key: string): Promise<IClientKeysNostrAddResolve>;
+ nostr_read(public_key: string): Promise<IClientKeysNostrReadResolve>;
+ nostr_read_all(): Promise<IClientKeysNostrReadAllResolve>;
+ nostr_delete(public_key: string): Promise<IClientKeysNostrDeleteResolve>;
+ nostr_keystore_reset(): Promise<IClientKeysNostrKeystoreResetResolve>;
+};
+\ No newline at end of file
diff --git a/client/src/keystore/tauri.ts b/client/src/keystore/tauri.ts
@@ -1,81 +0,0 @@
-import { err_msg, type ErrorMessage, type ResultObj, type ResultPass, type ResultsList } from '@radroots/utils';
-import { load, Store } from '@tauri-apps/plugin-store';
-import type { IClientUnlisten } from '../types';
-import type { IClientKeystore } from './types';
-
-export class TauriClientKeystore implements IClientKeystore {
- private _store: Store | null = null;
- private _store_path: string;
-
- constructor(store_path: string = 'store.json') {
- this._store_path = store_path;
- }
-
- public async init(): Promise<void> {
- this._store = await load(this._store_path);
- }
-
- public async set(key: string, value: string): Promise<ResultPass | ErrorMessage<string>> {
- try {
- if (!this._store) return err_msg(`*-store`);
- await this._store.set(key, { value });
- await this._store.save();
- return { pass: true };
- } catch (e) {
- return err_msg(`*`);
- };
- }
-
- public async get(key: string): Promise<ResultObj<string> | ErrorMessage<string>> {
- try {
- if (!this._store) return err_msg(`*-store`);
- const result = await this._store.get<{ value: any }>(key);
- if (result && typeof result.value === `string`) return { result: result.value };
- return err_msg(`*-result`);
- } catch (e) {
- return err_msg(`*`);
- };
- }
-
- public async remove(key: string): Promise<ResultPass | ErrorMessage<string>> {
- try {
- if (!this._store) return err_msg(`*-store`);
- const res = await this._store.delete(key);
- if (!res) return err_msg(`*-pass`);
- await this._store.save();
- return { pass: true };
- } catch (e) {
- return err_msg(`*`);
- };
- }
-
- public async keys(): Promise<ResultsList<string> | ErrorMessage<string>> {
- try {
- if (!this._store) return err_msg(`*-store`);
- const results = await this._store.keys();
- return { results };
- } catch (e) {
- return err_msg(`*`);
- };
- }
-
- public async entries(): Promise<ResultsList<[string, unknown]> | ErrorMessage<string>> {
- try {
- if (!this._store) return err_msg(`*-store`);
- const results = await this._store.entries();
- return { results };
- } catch (e) {
- return err_msg(`*`);
- };
- }
-
- public async on_key_change(key: string, callback: (value: string | null) => Promise<void>): Promise<IClientUnlisten | ErrorMessage<string>> {
- try {
- if (!this._store) return err_msg(`*-store`);
- const res = await this._store.onKeyChange<{ value: any }>(key, async (res) => await callback(res && `value` in res ? String(res.value) : null));
- return res;
- } catch (e) {
- return err_msg(`*`);
- };
- }
-}
diff --git a/client/src/keystore/types.ts b/client/src/keystore/types.ts
@@ -1,12 +0,0 @@
-import type { ErrorMessage, ResultObj, ResultPass, ResultsList } from "@radroots/utils";
-import type { IClientUnlisten } from "../types";
-
-export type IClientKeystore = {
- init(): Promise<void>;
- set(key: string, val: string): Promise<ResultPass | ErrorMessage<string>>;
- get(key: string): Promise<ResultObj<string> | ErrorMessage<string>>;
- keys(): Promise<ResultsList<string> | ErrorMessage<string>>;
- entries(): Promise<ResultsList<[string, unknown]> | ErrorMessage<string>>
- remove(key: string): Promise<ResultPass | ErrorMessage<string>>;
- on_key_change(key: string, callback: (value: string | null) => Promise<void>): Promise<IClientUnlisten | ErrorMessage<string>>;
-};
-\ No newline at end of file
diff --git a/client/src/lib.ts b/client/src/lib.ts
@@ -0,0 +1,3 @@
+import { TauriClientHttp } from ".";
+
+export const lib_http = new TauriClientHttp();
diff --git a/client/src/logger/tauri.ts b/client/src/logger/tauri.ts
@@ -1,9 +0,0 @@
-import { attachConsole } from '@tauri-apps/plugin-log';
-import type { IClientUnlisten } from '../types';
-import type { IClientLogger } from "./types";
-
-export class TauriClientLogger implements IClientLogger {
- public async init(): Promise<IClientUnlisten> {
- return await attachConsole();
- }
-}
diff --git a/client/src/logger/types.ts b/client/src/logger/types.ts
@@ -1,5 +0,0 @@
-import type { IClientUnlisten } from "../types";
-
-export type IClientLogger = {
- init(): Promise<IClientUnlisten>;
-};
-\ No newline at end of file
diff --git a/client/src/notification/tauri.ts b/client/src/notification/tauri.ts
@@ -1,31 +0,0 @@
-
-import {
- isPermissionGranted,
- requestPermission,
- sendNotification
-} from '@tauri-apps/plugin-notification';
-import type { IClientNotification, IClientNotificationPermission, IClientNotificationSendOptions } from "./types";
-
-export class TauriClientNotification implements IClientNotification {
- public async init(): Promise<IClientNotificationPermission | undefined> {
- try {
- const permission = await requestPermission();
- return permission;
- } catch (e) {
- console.log(`e init`, e)
- };
- }
-
- public async send(opts: string | IClientNotificationSendOptions): Promise<void> {
- try {
- if (!(await isPermissionGranted())) {
- const permission = await this.init();
- if (permission !== 'granted') return;
- };
-
- sendNotification(typeof opts === `string` ? { title: `Radroots`, body: opts } : opts);
- } catch (e) {
- console.log(`e send`, e)
- };
- }
-}
diff --git a/client/src/notification/types.ts b/client/src/notification/types.ts
@@ -1,9 +0,0 @@
-import type { Options } from "@tauri-apps/plugin-notification";
-
-export type IClientNotificationPermission = "default" | "denied" | "granted";
-export type IClientNotificationSendOptions = Options;
-
-export type IClientNotification = {
- init(): Promise<IClientNotificationPermission | undefined>;
- send(opts: string | IClientNotificationSendOptions): Promise<void>;
-};
-\ No newline at end of file
diff --git a/client/src/os/tauri.ts b/client/src/os/tauri.ts
@@ -1,28 +0,0 @@
-import { err_msg, type ErrorMessage, type ResultObj } from '@radroots/utils';
-import { arch, hostname, platform, version } from '@tauri-apps/plugin-os';
-import type { IClientOs } from "./types";
-
-export class TauriClientOs implements IClientOs {
- public version(): string {
- return version();
- }
-
- public platform(): string {
- return platform();
- }
-
- public arch(): string {
- return arch();
- }
-
- public async hostname(): Promise<ResultObj<string> | ErrorMessage<string>> {
- try {
- const result = await hostname();
- if (!result) return err_msg(`*-result`);
- return { result }
- } catch (e) {
- return err_msg(`*`);
- };
- }
-
-}
diff --git a/client/src/os/types.ts b/client/src/os/types.ts
@@ -1,8 +0,0 @@
-import type { ErrorMessage, ResultObj } from "@radroots/utils";
-
-export type IClientOs = {
- version(): string;
- platform(): string;
- arch(): string;
- hostname(): Promise<ResultObj<string> | ErrorMessage<string>>
-};
-\ No newline at end of file
diff --git a/client/src/radroots/tauri.ts b/client/src/radroots/tauri.ts
@@ -0,0 +1,104 @@
+
+import { err_msg, type IHttpResponse, is_err_response, is_error_response, lib_nostr_event_sign_attest } from '@radroots/utils';
+import { lib_http } from '../lib';
+import type { IClientRadroots, IClientRadrootsFetchMediaImageUpload, IClientRadrootsFetchMediaImageUploadResolve, IClientRadrootsFetchProfileActivate, IClientRadrootsFetchProfileActivateResolve, IClientRadrootsFetchProfileCreate, IClientRadrootsFetchProfileCreateResolve, IClientRadrootsFetchProfileRequest, IClientRadrootsFetchProfileRequestResolve } from './types';
+
+export class TauriClientRadroots implements IClientRadroots {
+ private _base_url: string;
+
+ constructor(base_url: string) {
+ this._base_url = base_url.replaceAll(`/`, ``);
+ }
+
+ private is_res_pass(res: IHttpResponse): boolean {
+ return res.data && res.data.pass === true;
+ }
+
+ private parse_res_field(field: any): string | undefined {
+ if (typeof field === `string` && field) return field;
+ }
+
+ public fetch_profile_request = async (opts: IClientRadrootsFetchProfileRequest): Promise<IClientRadrootsFetchProfileRequestResolve> => {
+ const { profile_name, secret_key } = opts;
+ const res = await lib_http.fetch({
+ url: `${this._base_url}/public/profile/request`,
+ method: `post`,
+ headers: {
+ "X-Nostr-Event": JSON.stringify(lib_nostr_event_sign_attest(secret_key)),
+ },
+ data: {
+ profile_name
+ }
+ });
+ if (is_err_response(res)) return res;
+ if (is_error_response(res)) err_msg(res.error);
+ else if (this.is_res_pass(res)) {
+ const tok = this.parse_res_field(res.data.tok);
+ if (tok) return { result: res.data.tok };
+ }
+ return err_msg(`error.radroots.profile_registered`);
+ }
+
+ public fetch_profile_create = async (opts: IClientRadrootsFetchProfileCreate): Promise<IClientRadrootsFetchProfileCreateResolve> => {
+ const { tok, secret_key } = opts;
+ const res = await lib_http.fetch({
+ url: `${this._base_url}/public/profile/create`,
+ method: `post`,
+ headers: {
+ "X-Nostr-Event": JSON.stringify(lib_nostr_event_sign_attest(secret_key)),
+ },
+ authorization: tok,
+ });
+ if (is_err_response(res)) return res;
+ if (is_error_response(res)) err_msg(res.error);
+ else if (this.is_res_pass(res)) {
+ const id = this.parse_res_field(res.data.id);
+ if (id) return { result: id };
+ }
+ return err_msg(`error.client.request_failure`);
+ }
+
+ public fetch_profile_activate = async (opts: IClientRadrootsFetchProfileActivate): Promise<IClientRadrootsFetchProfileActivateResolve> => {
+ const { id, secret_key } = opts;
+ const res = await lib_http.fetch({
+ url: `${this._base_url}/public/profile/activate`,
+ method: `post`,
+ headers: {
+ "X-Nostr-Event": JSON.stringify(lib_nostr_event_sign_attest(secret_key)),
+ },
+ data: {
+ id
+ }
+ });
+ if (is_err_response(res)) return res;
+ if (is_error_response(res)) err_msg(res.error);
+ else if (this.is_res_pass(res)) return { pass: true };
+ return err_msg(`error.client.request_failure`);
+ }
+
+ public fetch_media_image_upload = async (opts: IClientRadrootsFetchMediaImageUpload): Promise<IClientRadrootsFetchMediaImageUploadResolve> => {
+ const { file_path, file_data, secret_key } = opts;
+ const res = await lib_http.fetch({
+ url: `${this._base_url}/public/media/image/upload`,
+ method: `put`,
+ headers: {
+ "Content-Type": file_path.mime_type,
+ "X-Nostr-Event": JSON.stringify(lib_nostr_event_sign_attest(secret_key)),
+ },
+ data_bin: file_data,
+ });
+ if (is_err_response(res)) return res;
+ if (is_error_response(res)) err_msg(res.error);
+ else if (
+ this.is_res_pass(res) &&
+ `res_base` in res.data &&
+ typeof res.data.res_base === `string` &&
+ `res_path` in res.data &&
+ typeof res.data.res_path === `string`) return {
+ res_base: res.data.res_base,
+ res_path: res.data.res_path,
+ };
+ return err_msg(`error.client.request_failure`);
+ }
+}
+
diff --git a/client/src/radroots/types.ts b/client/src/radroots/types.ts
@@ -0,0 +1,21 @@
+import { type ErrorMessage, type FilePath, type ResultObj, type ResultPass } from '@radroots/utils';
+
+export type IClientRadrootsFetchProfileRequestMessage =
+ | string
+ | `error.client.request_failure`
+ | `*-registered`;
+
+export type IClientRadrootsFetchProfileRequest = { profile_name: string; secret_key: string; };
+export type IClientRadrootsFetchProfileRequestResolve = ResultObj<string> | ErrorMessage<IClientRadrootsFetchProfileRequestMessage>;
+export type IClientRadrootsFetchProfileCreate = { tok: string; secret_key: string; };
+export type IClientRadrootsFetchProfileCreateResolve = ResultObj<string> | ErrorMessage<IClientRadrootsFetchProfileRequestMessage>;
+export type IClientRadrootsFetchProfileActivate = { id: string; secret_key: string; };
+export type IClientRadrootsFetchProfileActivateResolve = ResultPass | ErrorMessage<IClientRadrootsFetchProfileRequestMessage>;
+export type IClientRadrootsFetchMediaImageUpload = { file_path: FilePath; file_data: Uint8Array; secret_key: string; };
+export type IClientRadrootsFetchMediaImageUploadResolve = any;
+export type IClientRadroots = {
+ fetch_profile_request: (opts: IClientRadrootsFetchProfileRequest) => Promise<IClientRadrootsFetchProfileRequestResolve>;
+ fetch_profile_create: (opts: IClientRadrootsFetchProfileCreate) => Promise<IClientRadrootsFetchProfileCreateResolve>;
+ fetch_profile_activate: (opts: IClientRadrootsFetchProfileActivate) => Promise<IClientRadrootsFetchProfileActivateResolve>;
+ fetch_media_image_upload: (opts: IClientRadrootsFetchMediaImageUpload) => Promise<IClientRadrootsFetchMediaImageUploadResolve>;
+};
+\ No newline at end of file
diff --git a/client/src/util.ts b/client/src/util.ts
@@ -0,0 +1,14 @@
+import type { IClientPlatform } from "./types";
+
+export function parse_platform(str: string): IClientPlatform {
+ switch (str) {
+ case `ios`:
+ case `androiď`:
+ case `web`:
+ return str;
+ default:
+ return `web`;
+ };
+};
+
+
diff --git a/client/src/utils.ts b/client/src/utils.ts
@@ -1,17 +0,0 @@
-import type { IClientPlatform } from "./types";
-
-export function parse_platform(str: string): IClientPlatform {
- switch (str) {
- case `ios`:
- case `androiď`:
- case `web`:
- return str;
- default:
- return `web`;
- };
-};
-
-export function parse_location_coords(number: number): number {
- return Math.round(number * 1e7) / 1e7;
-};
-
diff --git a/client/src/window/tauri.ts b/client/src/window/tauri.ts
@@ -1,17 +0,0 @@
-import { invoke } from "@tauri-apps/api/core";
-import type { IClientWindow } from "./types";
-
-export class TauriClientWindow implements IClientWindow {
- public async splash_hide(): Promise<void> {
- try {
- await invoke('hide_splashscreen')
- } catch (e) { };
- }
-
- public async splash_show(showDuration?: number): Promise<void> {
- try {
- await invoke('show_splashscreen')
-
- } catch (e) { };
- }
-}
diff --git a/client/src/window/types.ts b/client/src/window/types.ts
@@ -1,4 +0,0 @@
-export type IClientWindow = {
- splash_hide(): Promise<void>;
- splash_show(showDuration?: number): Promise<void>;
-};
-\ No newline at end of file