start some documentation work

This commit is contained in:
waveringana 2023-08-25 20:03:30 -04:00
parent a42eeeda90
commit 1e23bd879b
8 changed files with 8857 additions and 11052 deletions

View file

@ -1,32 +1,37 @@
# Embedder
# Embedder 🖼️
A media host specialized in good looking embeds for services like Discord. No file size limits. No compression.
A media host specialized in producing visually appealing embeds for services like Discord. Enjoy limitless file sizes and no compression.
<img src="readmegif.gif">
![Embedder Demo](documentation/readmegif.gif)
Upcoming Features:
* Guest user accounts
* MariaDB/SQL support (uses sqlite for now)
## 🚀 Upcoming Features
Potential:
* IPFS
- 📊 MariaDB/SQL support (currently uses SQLite)
- 🔗 Redundancy & Sync: Enhance reliability and enable synchronization across nodes.
## Run
## 🌐 Potential Features
Source:
```Bash
- 🛰️ IPFS Integration
## 🔧 How to Run
### Using Source
```bash
$ export EBPASS=changeme
$ export EBPORT=3000
$ export EBAPI_KEY=changeme #ShareX support
$ export EBAPI_KEY=changeme # For ShareX support
$ npm install
$ npm start
```
Default username is admin with the password being whatever EBPASS is
**Note**: Default username is `admin` with the password being whatever `EBPASS` is set to.
ShareX support is enabled at "/upload", requires auth with key, expire key is in days
JSON
```
### ShareX Support
Enabled at `/upload`. Requires authentication with key. `expire` key specifies duration in days.
```json
{
"Version": "14.1.0",
"Name": "embedder",
@ -49,13 +54,15 @@ JSON
}
```
Docker Config
```
### Using Docker
```bash
docker run -d -p "3000:3000" -e EBPORT=3000 -e EBPASS=changeme -e EBAPI_KEY=changeme ghcr.io/waveringana/embedder:1.7.2
```
Docker Compose
```
### Docker Compose
```yaml
version: '3.3'
services:
embedder:
@ -68,9 +75,9 @@ services:
volumes:
- ./db:/var/db
- ./uploads:/uploads
image: ghcr.io/waveringana/embedder:1.7.2
image: ghcr.io/waveringana/embedder:1.9.1
```
## License
## 📜 License
[The Unlicense](https://opensource.org/licenses/unlicense)
Distributed under [The Unlicense](https://opensource.org/licenses/unlicense).

View file

@ -7,8 +7,8 @@ mkdirp.sync("./var/db");
export const db = new sqlite3.Database("./var/db/media.db");
/**Create the database schema for the embedders app*/
export function createDatabase(version: number){
// create the database schema for the embedders app
console.log("Creating database");
db.run("CREATE TABLE IF NOT EXISTS users ( \
@ -46,6 +46,27 @@ export function updateDatabase(oldVersion: number, newVersion: number){
}
}
/**Inserts into the media table */
export function insertToDB (filename: string, expireDate: Date, username: string) {
const params: MediaParams = [
filename,
expireDate,
username
];
db.run("INSERT INTO media (path, expire, username) VALUES (?, ?, ?)", params, function (err) {
if (err) {
console.log(err);
return err;
}
console.log(`Uploaded ${filename} to database`);
if (expireDate == null)
console.log("It will not expire");
else if (expireDate != null || expireDate != undefined)
console.log(`It will expire on ${expireDate}`);
});
}
/**Searches the database and returns images with partial or exact keysearches */
export function searchImages(imagename: string, partial: boolean) {
return new Promise((resolve, reject) => {
@ -75,7 +96,7 @@ export function createUser(username: string, password: string) {
});
}
/**Selects a path for a file given ID */
/**Selects the path for a file given ID */
export function getPath(id: number | string) {
return new Promise((resolve, reject) => {
const query = "SELECT path FROM media WHERE id = ?";

View file

@ -10,7 +10,7 @@ import fs from "fs";
import process from "process";
import {extension, videoExtensions, imageExtensions} from "./lib";
import {db, MediaParams} from "./db";
import {db, MediaParams, insertToDB} from "./db";
export const checkAuth: Middleware = (req, res, next) => {
if (!req.user) {
@ -158,31 +158,10 @@ export const handleUpload: Middleware = (req, res, next) => {
if (files instanceof Array) {
for (const file in files) {
insertToDB(files[file].filename, expireDate, username, next);
insertToDB(files[file].filename, expireDate, username);
}
} else
insertToDB(files.filename, expireDate, username, next);
insertToDB(files.filename, expireDate, username);
next();
};
/**Inserts into media database */
function insertToDB (filename: string, expireDate: Date, username: string, next: NextFunction) {
const params: MediaParams = [
filename,
expireDate,
username
];
db.run("INSERT INTO media (path, expire, username) VALUES (?, ?, ?)", params, function (err) {
if (err) {
console.log(err);
return next(err);
}
console.log(`Uploaded ${filename} to database`);
if (expireDate == null)
console.log("It will not expire");
else if (expireDate != null || expireDate != undefined)
console.log(`It will expire on ${expireDate}`);
});
}

103
documentation/database.md Normal file
View file

@ -0,0 +1,103 @@
# Database Documentation for Embedder
Embedder utilizes **SQLite3** to manage its user system and store metadata for uploaded files.
---
## Databases:
### `media.db`
- **Description**: Manages the user system and image metadata.
### `session.db`
- **Description**: Handles login session data to keep users logged in over time.
---
## Tables:
### Media Table
#### TypeScript Interface: `MediaRow`
- **Description**: Represents a row in the media table.
- **Fields**:
- `id`: Optional number or string
- `path`: String
- `expire`: Date object
- `username`: Optional string
#### SQL Structure
- `id`: INTEGER
- `path`: TEXT
- `expire`: INTEGER
- `username`: TEXT
---
### User Table
#### TypeScript Interface: `UserRow`
- **Description**: Represents a row in the user table.
- **Fields**:
- `id`: Optional number
- `username`: String
- `hashed_password`: Any
- `salt`: Any
#### SQL Structure
- `id`: INTEGER
- `username`: TEXT
- `hashed_password`: BLOB
- `expire`: INTEGER
- `salt`: BLOB
---
## Database Interactions (`lib/db.ts`)
### `createDatabase(version: number)`
- **Description**: Initializes the database schema.
- **Parameters**:
- `version`: Number indicating the version of the database schema.
### `createUser(username: string, password: string)`
- **Description**: Inserts a new user record into the user table.
- **Parameters**:
- `username`: String representing the user's name.
- `password`: String representing the user's password.
### `insertToDB(filename: string, expireDate: Date, username: string)`
- **Description**: Adds a new media record into the media table.
- **Parameters**:
- `filename`: String representing the filename of the uploaded media.
- `expireDate`: Date object indicating when the media should expire.
- `username`: String representing the user's name.
### `getPath(id: number | string)`
- **Description**: Retrieves the path for a specific file using its ID.
- **Parameters**:
- `id`: Number or string representing the file's ID.
### `deleteId(database: string, id: number | string)`
- **Description**: Removes a record from the database.
- **Parameters**:
- `database`: String representing the name of the database.
- `id`: Number or string representing the ID of the record to be removed.
### `expire(database: string, column: string, expiration: number)`
- **Description**: Sets an expiration date for a particular database row.
- **Parameters**:
- `database`: String representing the name of the database.
- `column`: String representing the name of the column in which the date should be set.
- `expiration`: Number representing the Unix timestamp when the record should expire.

View file

@ -0,0 +1,60 @@
# Express Middleware Documentation for Embedder
Embedder employs a series of middleware functions to facilitate operations such as user authentication, media conversions, and handling uploaded files.
## Middleware Functions
---
### `checkAuth()`
- **Description**: Ensures the user is authenticated.
- **Parameters**:
- `req`: Express request object
- `res`: Express response object
- `next`: Callback to the next middleware function
---
### `checkSharexAuth()`
- **Description**: Validates the ShareX authentication key provided in the headers.
- **Parameters**:
- `req`: Express request object
- `res`: Express response object
- `next`: Callback to the next middleware function
---
### `createEmbedData()`
- **Description**: Generates oEmbed metadata for embeds and saves them as JSON files.
- **Parameters**:
- `req`: Express request object
- `res`: Express response object
- `next`: Callback to the next middleware function
---
### `convert()`
- **Description**: Converts media files between video and GIF formats using ffmpeg.
- **Parameters**:
- `req`: Express request object
- `res`: Express response object
- `next`: Callback to the next middleware function
---
### `convertTo720p()`
- **Description**: Converts the uploaded video to a 720p resolution to reduce file size.
- **Parameters**:
- `req`: Express request object
- `res`: Express response object
- `next`: Callback to the next middleware function
---
### `handleUpload()`
- **Description**: Manages the uploaded files and records their metadata into the database.
- **Parameters**:
- `req`: Express request object
- `res`: Express response object
- `next`: Callback to the next middleware function

View file

Before

Width:  |  Height:  |  Size: 2.3 MiB

After

Width:  |  Height:  |  Size: 2.3 MiB

Before After
Before After

30
documentation/routing.md Normal file
View file

@ -0,0 +1,30 @@
# Routing
Embedder utilizes **Express** for routing and serving the app. Templating is currently with **EJS**, but there's a potential future migration to **React**. **Passport** is employed for authentication.
## Routes:
- **/** ([index.ts](../app/routes/index.ts))
- `GET`:
- Unauthenticated: Serve `home.ejs`
- Authenticated: Serve `index.ejs`
- `POST`: Redirect to `/`
- **/login** ([auth.ts](../app/routes/auth.ts))
- `GET`: Serve `login.ejs`
- `POST` to `/login/password`:
- Success: Redirect to `/`
- Failure: Redirect to `/login`
- **/logout** ([auth.ts](../app/routes/auth.ts))
- `POST`: Redirect to `/`
- **/gifv** ([index.ts](../app/routes/index.ts))
- `GET`: Serve `gifv.ejs`
- `POST` to `/adduser`: Redirect to `/`
- **/adduser** ([adduser.ts](../app/routes/adduser.ts))
- `GET`: Serve `adduser.ejs`
- **/sharex** ([index.ts](../app/routes/index.ts))
- `POST`: Response is text containing path to uploaded file

2475
package-lock.json generated

File diff suppressed because it is too large Load diff