Added start of cdn implementation.
This commit is contained in:
parent
67bc04b0fc
commit
4760a5833d
|
@ -1,2 +1,7 @@
|
||||||
# Gymboard
|
# Gymboard
|
||||||
Leaderboards for your local community gym.
|
Leaderboards for your local community gym.
|
||||||
|
|
||||||
|
## Development
|
||||||
|
Gymboard is comprised of a variety of components, each in its own directory, and with its own project format. Follow the instructions in the README of the respective project to set that one up.
|
||||||
|
|
||||||
|
A `docker-compose.yml` file is defined in this directory, and it defines a set of services that may be used by one or more services. Install docker on your system if you haven't already, and run `docker-compose up -d` to start the services.
|
||||||
|
|
|
@ -13,6 +13,16 @@ services:
|
||||||
POSTGRES_USER: gymboard-api-dev
|
POSTGRES_USER: gymboard-api-dev
|
||||||
POSTGRES_PASSWORD: testpass
|
POSTGRES_PASSWORD: testpass
|
||||||
|
|
||||||
|
# Database for the gymboard-cdn.
|
||||||
|
cdn-db:
|
||||||
|
image: postgres
|
||||||
|
restart: always
|
||||||
|
ports:
|
||||||
|
- "5433:5432"
|
||||||
|
environment:
|
||||||
|
POSTGRES_USER: gymboard-cdn-dev
|
||||||
|
POSTGRES_PASSWORD: testpass
|
||||||
|
|
||||||
mailhog:
|
mailhog:
|
||||||
image: mailhog/mailhog
|
image: mailhog/mailhog
|
||||||
restart: always
|
restart: always
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
# Gymboard-CDN
|
||||||
|
|
||||||
|
To avoid having to do expensive and complex computations in the main Gymboard API to handle user video uploads, that functionality is provided by this _Gymboard-CDN_ project.
|
||||||
|
|
||||||
|
This CDN offers basic, unauthenticated upload and download capabilities, as well as asynchronous processing of video files to reduce disk usage.
|
||||||
|
|
||||||
|
It offers the following endpoints:
|
||||||
|
- `POST /uploads` - Upload files here.
|
||||||
|
- `GET /uploads/{id}` - Fetch uploaded files.
|
|
@ -4,7 +4,8 @@
|
||||||
],
|
],
|
||||||
"copyright": "Copyright © 2023, Andrew Lalis",
|
"copyright": "Copyright © 2023, Andrew Lalis",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"handy-httpd": "~>4.0.2"
|
"dpq2": "~>1.1.3",
|
||||||
|
"handy-httpd": "~>5.0.0"
|
||||||
},
|
},
|
||||||
"description": "Content delivery network for Gymboard.",
|
"description": "Content delivery network for Gymboard.",
|
||||||
"license": "proprietary",
|
"license": "proprietary",
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
{
|
||||||
|
"fileVersion": 1,
|
||||||
|
"versions": {
|
||||||
|
"derelict-pq": "4.0.0",
|
||||||
|
"derelict-util": "3.0.0-beta.2",
|
||||||
|
"dpq2": "1.1.3",
|
||||||
|
"handy-httpd": "5.0.0",
|
||||||
|
"httparsed": "1.2.1",
|
||||||
|
"money": "3.0.2",
|
||||||
|
"stdx-allocator": "2.77.5",
|
||||||
|
"unit-threaded": "2.1.2",
|
||||||
|
"vibe-d": "0.9.5"
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,6 +1,47 @@
|
||||||
|
import handy_httpd;
|
||||||
|
import handy_httpd.handlers.path_delegating_handler;
|
||||||
|
import dpq2;
|
||||||
import std.stdio;
|
import std.stdio;
|
||||||
|
|
||||||
void main()
|
const DB_URL = "host=127.0.0.1 port=5433 dbname=gymboard-cdn-dev user=gymboard-cdn-dev password=testpass";
|
||||||
{
|
|
||||||
writeln("Edit source/app.d to start your project.");
|
void main() {
|
||||||
|
ServerConfig config = ServerConfig.defaultValues();
|
||||||
|
config.port = 8082;
|
||||||
|
config.reuseAddress = true;
|
||||||
|
config.workerPoolSize = 10;
|
||||||
|
PathDelegatingHandler handler = new PathDelegatingHandler();
|
||||||
|
handler.addMapping("GET", "/uploads/{uploadId}", new VideoFetcher());
|
||||||
|
handler.addMapping("POST", "/uploads", new VideoUploader());
|
||||||
|
HttpServer server = new HttpServer(handler, config);
|
||||||
|
server.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
Connection connectToDb() {
|
||||||
|
return new Connection(DB_URL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler that fetches a video by its id (if it exists).
|
||||||
|
*/
|
||||||
|
class VideoFetcher : HttpRequestHandler {
|
||||||
|
void handle(ref HttpRequestContext ctx) {
|
||||||
|
long uploadId = ctx.request.getPathParamAs!ulong("uploadId", 0);
|
||||||
|
writeln(uploadId);
|
||||||
|
auto conn = connectToDb();
|
||||||
|
QueryParams p;
|
||||||
|
p.sqlCommand = "SELECT 'hello world';";
|
||||||
|
auto answer = conn.execParams(p);
|
||||||
|
scope(exit) destroy(answer);
|
||||||
|
writeln(answer[0][0].as!PGtext);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler that processes a video upload.
|
||||||
|
*/
|
||||||
|
class VideoUploader : HttpRequestHandler {
|
||||||
|
void handle(ref HttpRequestContext ctx) {
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue