From 79266314bc11a107ebf127a12ad2cf3cd1ef853a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sof=C3=ADa=20Aritz?= Date: Sun, 30 Jun 2024 19:41:15 +0200 Subject: [PATCH] more docs! --- README.md | 4 ++- asset-api/README.md | 11 +++++++ identity-api/README.md | 12 ++++++++ identity-web/README.md | 52 ++++++++++++-------------------- identity-web/static/favicon.png | Bin 1571 -> 18347 bytes 5 files changed, 45 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index 60e7f28..847279b 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ for conditions such as dementia. Over time, the idea evolved and is now a genera ## Projects -* `identity-web`. The web app that interacts with the Identiy API. +* `identity-web`. The web app that interacts with the Identiy API and the Asset API. * `identity-api`. The Identity API, takes care of storing user data. * `asset-api`. The Asset API, takes care of storing user-generated assets. @@ -50,6 +50,8 @@ The recommended Node.JS version is v21.5.0, others should also work. ### Building and running +**Note:** Identity is not stable nor secure. Production instances are **highly discouraged.** + #### Building `identity-web` 1. Copy and update the `env.example` file: `cp .env.example .env` diff --git a/asset-api/README.md b/asset-api/README.md index e086a95..59958f6 100644 --- a/asset-api/README.md +++ b/asset-api/README.md @@ -1 +1,12 @@ # asset-api + +The Asset API, takes care of storing user-generated assets. + +## Development and local testing + +1. Copy the `.env.example` file: `cp .env.example .env` +2. Run `yarn` to install the dependencies. + * You may need to [enable Corepack](https://nodejs.org/api/corepack.html). +3. Run `yarn start` to start the server. + * You may need to create an empty folder at `$/asset-api/.keys`. +4. You're ready to go! You will need to restart the server manually when you make changed (unless you use something like [Nodemon](https://www.npmjs.com/package/nodemon)). \ No newline at end of file diff --git a/identity-api/README.md b/identity-api/README.md index ae12c0c..347d719 100644 --- a/identity-api/README.md +++ b/identity-api/README.md @@ -1 +1,13 @@ # identity-api + +The Identity API, takes care of storing user data. + +## Development and local testing + +1. Copy the `.env.example` file: `cp .env.example .env` +2. Run `yarn` to install the dependencies. + * You may need to [enable Corepack](https://nodejs.org/api/corepack.html). +3. Run `yarn start` to start the server. + * **Note:** The `asset-api` server **must** be running before this command is run. [More info](./docs/asset-implementation.md). + * You may need to create an empty folder at `$/identity-api/.database`. +4. You're ready to go! You will need to restart the server manually when you make changed (unless you use something like [Nodemon](https://www.npmjs.com/package/nodemon)). \ No newline at end of file diff --git a/identity-web/README.md b/identity-web/README.md index 5ce6766..0822c81 100644 --- a/identity-web/README.md +++ b/identity-web/README.md @@ -1,38 +1,24 @@ -# create-svelte +# identity-web -Everything you need to build a Svelte project, powered by [`create-svelte`](https://github.com/sveltejs/kit/tree/main/packages/create-svelte). +The web app that interacts with the Identiy API and the Asset API. -## Creating a project +## Development and local testing -If you're seeing this, you've probably already done this step. Congrats! +1. Copy the `.env.example` file: `cp .env.example .env` +2. Run `yarn` to install the dependencies. + * You may need to [enable Corepack](https://nodejs.org/api/corepack.html). +3. Run `yarn dev` and open the specified URL. +4. You're ready to go! Any changes should be reflected in real time. -```bash -# create a new project in the current directory -npm create svelte@latest +## Structure -# create a new project in my-app -npm create svelte@latest my-app -``` - -## Developing - -Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: - -```bash -npm run dev - -# or start the server and open the app in a new browser tab -npm run dev -- --open -``` - -## Building - -To create a production version of your app: - -```bash -npm run build -``` - -You can preview the production build with `npm run preview`. - -> To deploy your app, you may need to install an [adapter](https://kit.svelte.dev/docs/adapters) for your target environment. +* `./routes` - The pages and associated components. Part of the SvelteKit filesystem routing. +Most of the code is here. +* `./lib` - Various global elements. + * `./lib/api.ts` - The stateless functions that interact with the Identity API and the Asset API. + * `./lib/stores.ts` - The global stores, used to store things like tokens and account info. + * `./lib/entry.ts` - The definitions for an entry. + - **Note:** This file may be moved to a common package in the near future to simplify the + server development process. + * `./lib/assets` - Images used in the landing page. + * `./lib/components` - Components used across various pages. \ No newline at end of file diff --git a/identity-web/static/favicon.png b/identity-web/static/favicon.png index 825b9e65af7c104cfb07089bb28659393b4f2097..df2f8a3926fa62f44709973676a408f5604094f7 100644 GIT binary patch literal 18347 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