107 lines
3.7 KiB
C
107 lines
3.7 KiB
C
/*
|
|
* bookmarks.h — NIP-44 encrypted Nostr bookmarks with directories
|
|
*
|
|
* Stores bookmarks as NIP-51 kind 30003 (bookmark sets) events, one per
|
|
* directory. Each directory's bookmarks are NIP-44 encrypted (self-to-self)
|
|
* and stored in the event's content field as a JSON tag array.
|
|
*
|
|
* The bookmarks sync across all devices the user logs in on via the
|
|
* bootstrap relays.
|
|
*/
|
|
|
|
#ifndef BOOKMARKS_H
|
|
#define BOOKMARKS_H
|
|
|
|
#include <glib.h>
|
|
#include <time.h>
|
|
|
|
/* nostr_signer_t is needed for the init function */
|
|
#include "nostr_core/nostr_signer.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#define BOOKMARKS_MAX_PER_DIR 500
|
|
#define BOOKMARKS_DIR_NAME_MAX 128
|
|
#define BOOKMARKS_URL_MAX 2048
|
|
#define BOOKMARKS_TITLE_MAX 256
|
|
|
|
typedef struct {
|
|
char *url;
|
|
char *title;
|
|
long added; /* unix timestamp */
|
|
} bookmark_t;
|
|
|
|
typedef struct {
|
|
char name[BOOKMARKS_DIR_NAME_MAX];
|
|
bookmark_t *bookmarks;
|
|
int count;
|
|
} bookmark_dir_t;
|
|
|
|
/*
|
|
* Initialize the bookmarks module. Loads cached bookmarks from the SQLite
|
|
* database and decrypts them using the signer.
|
|
*
|
|
* signer — the user's nostr_signer_t (NULL for read-only/no-login)
|
|
* pubkey_hex — the user's hex pubkey (64 chars)
|
|
*
|
|
* Returns 0 on success, -1 on error.
|
|
*/
|
|
int bookmarks_init(nostr_signer_t *signer, const char *pubkey_hex);
|
|
|
|
/* Free the in-memory bookmark list. Call at shutdown. */
|
|
void bookmarks_cleanup(void);
|
|
|
|
/* ── Read access ───────────────────────────────────────────────────── */
|
|
|
|
/* Get the list of directories (read-only). Returns a pointer to the
|
|
* internal array (valid until the next bookmarks operation). */
|
|
const bookmark_dir_t *bookmarks_get_dirs(int *count_out);
|
|
|
|
/* Get a specific directory by name. Returns NULL if not found. */
|
|
const bookmark_dir_t *bookmarks_get_dir(const char *name);
|
|
|
|
/* ── Write access (requires signer) ────────────────────────────────── */
|
|
|
|
/* Add a bookmark to a directory. If the directory doesn't exist, it's
|
|
* created. Updates the in-memory list, re-encrypts, publishes a new
|
|
* kind 30003 event for that directory, and stores in SQLite.
|
|
*
|
|
* Returns 0 on success, -1 on error. */
|
|
int bookmarks_add(const char *dir, const char *url, const char *title);
|
|
|
|
/* Remove a bookmark by URL from a directory.
|
|
* Returns 0 on success, -1 on not found / error. */
|
|
int bookmarks_remove(const char *dir, const char *url);
|
|
|
|
/* Move a bookmark from one directory to another.
|
|
* Returns 0 on success, -1 on error. */
|
|
int bookmarks_move(const char *from_dir, const char *url,
|
|
const char *to_dir);
|
|
|
|
/* Create a new empty directory. Publishes an empty kind 30003 event.
|
|
* Returns 0 on success, -1 if directory already exists / error. */
|
|
int bookmarks_create_dir(const char *name);
|
|
|
|
/* Delete a directory. If move_to_general is TRUE, bookmarks are moved
|
|
* to "General" before deletion. Publishes a kind 5 deletion event.
|
|
* Returns 0 on success, -1 on error. */
|
|
int bookmarks_delete_dir(const char *name, int move_to_general);
|
|
|
|
/* ── Internal (used by relay fetch) ────────────────────────────────── */
|
|
|
|
/* Load bookmarks for a directory from a decrypted kind 30003 event's
|
|
* content JSON. Called by bookmarks_init and after relay fetch. */
|
|
int bookmarks_load_dir_from_json(const char *dir_name, const char *json);
|
|
|
|
/* Store a raw kind 30003 event in the database and decrypt its content
|
|
* into the in-memory list. Called by the relay fetch after login. */
|
|
int bookmarks_store_and_load_event(const void *event_cjson);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* BOOKMARKS_H */
|