Compare commits
4 Commits
automated-
...
b98fd1352a
Author | SHA1 | Date | |
---|---|---|---|
b98fd1352a | |||
a27214c8da | |||
b53c875eac | |||
0e92eda123 |
@ -1,44 +1,16 @@
|
|||||||
name: checks
|
name: checks
|
||||||
on:
|
on:
|
||||||
pull_request:
|
- push
|
||||||
paths: &CODE_PATHS
|
- pull_request
|
||||||
- 'src/**'
|
|
||||||
- 'Cargo*'
|
|
||||||
push:
|
|
||||||
paths: *CODE_PATHS
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
# TODO(cascode) cache checkout for build and test stages?
|
|
||||||
lint:
|
lint:
|
||||||
|
runs_on: "alpine_amd64"
|
||||||
container:
|
container:
|
||||||
# TODO use communitymedia docker registry
|
image: "rust:1.73-alpine3.18"
|
||||||
image: "cascode/aural-isle-ci:0"
|
name: format
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- name: TODO put in image base
|
||||||
with:
|
run: rustup component add rustfmt
|
||||||
github-server-url: "https://code.communitymedia.network"
|
|
||||||
- name: rustfmt
|
- name: rustfmt
|
||||||
run: cargo fmt --check
|
run: cargo fmt --check
|
||||||
build:
|
|
||||||
container:
|
|
||||||
# TODO use communitymedia docker registry
|
|
||||||
image: "cascode/aural-isle-ci:2"
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
with:
|
|
||||||
github-server-url: "https://code.communitymedia.network"
|
|
||||||
- name: build
|
|
||||||
run: cargo build
|
|
||||||
# TODO(cascode) cache builds for test stage
|
|
||||||
test:
|
|
||||||
container:
|
|
||||||
# TODO use communitymedia docker registry
|
|
||||||
image: "cascode/aural-isle-ci:2"
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
with:
|
|
||||||
github-server-url: "https://code.communitymedia.network"
|
|
||||||
- name: run unit tests
|
|
||||||
run: cargo test
|
|
||||||
|
24
MODELS.md
24
MODELS.md
@ -372,14 +372,9 @@ struct Video {
|
|||||||
|
|
||||||
# Collection
|
# Collection
|
||||||
|
|
||||||
A Collection represents one or more Albums, Tracks, and/or OtherProducts that are offered together as a package for Purchase
|
A Collection represents one or more Albums and/or Tracks that are offered together as a package for Purchase
|
||||||
|
|
||||||
``` rust
|
``` rust
|
||||||
enum CollectionItem {
|
|
||||||
Album(AlbumId),
|
|
||||||
Track(TrackId),
|
|
||||||
OtherProduct(OtherProductId),
|
|
||||||
}
|
|
||||||
struct CollectionId {
|
struct CollectionId {
|
||||||
id: String,
|
id: String,
|
||||||
}
|
}
|
||||||
@ -395,7 +390,9 @@ struct Collection {
|
|||||||
is_available: bool,
|
is_available: bool,
|
||||||
deleted_by: Option<PersonId>,
|
deleted_by: Option<PersonId>,
|
||||||
deleted_at: Option<chrono::DateTime>,
|
deleted_at: Option<chrono::DateTime>,
|
||||||
collection_items: Option<Vec<CollectionMember>>,
|
albums: Option<Vec<Album>>,
|
||||||
|
tracks: Option<Vec<Track>>,
|
||||||
|
other_products: Option<Vec<OtherProduct>>,
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -425,7 +422,7 @@ struct OtherProduct {
|
|||||||
|
|
||||||
# Purchase
|
# Purchase
|
||||||
|
|
||||||
A Purchase represents one or more Tracks, Albums, Collections, and/or OtherProducts that a Person purchases from an Artist or Label through the server.
|
A Purchase represents one or more Tracks or Albums that a Person purchases from an Artist or Label through the server.
|
||||||
|
|
||||||
``` rust
|
``` rust
|
||||||
enum PurchaseItemType {
|
enum PurchaseItemType {
|
||||||
@ -445,12 +442,11 @@ struct Sku {
|
|||||||
item: PurchaseItemType,
|
item: PurchaseItemType,
|
||||||
variant: Option<String>,
|
variant: Option<String>,
|
||||||
description: Option<String>,
|
description: Option<String>,
|
||||||
price: rusty_money::Money,
|
price: Option<rusty_money::Money>,
|
||||||
requires_shipping: bool,
|
requires_shipping: bool,
|
||||||
shipping_charge: Option<rusty_money::Money>,
|
|
||||||
}
|
}
|
||||||
struct LineItem {
|
struct PurchaseItem {
|
||||||
id: LineItemId,
|
id: PurchaseItemId,
|
||||||
sku: SkuId,
|
sku: SkuId,
|
||||||
quantity: usize,
|
quantity: usize,
|
||||||
}
|
}
|
||||||
@ -465,14 +461,12 @@ enum PurchaseState {
|
|||||||
}
|
}
|
||||||
struct Purchase {
|
struct Purchase {
|
||||||
id: String,
|
id: String,
|
||||||
items: Vec<LineItem>,
|
items: Vec<PurchaseItem>,
|
||||||
state: PurchaseState,
|
state: PurchaseState,
|
||||||
purchased_by: Person,
|
purchased_by: Person,
|
||||||
purchased_at: Option<chrono::DateTime>,
|
purchased_at: Option<chrono::DateTime>,
|
||||||
fulfilled_by: Option<Person>,
|
fulfilled_by: Option<Person>,
|
||||||
fulfilled_at: Option<chrono::DateTime>,
|
fulfilled_at: Option<chrono::DateTime>,
|
||||||
coupons_applied: Option<Vec<CouponCodeId>>,
|
|
||||||
total_charge: rusty_money::Money,
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
206
SCHEMA.md
206
SCHEMA.md
@ -705,208 +705,26 @@ CREATE INDEX ArticleComments_article_id_IDX ON ArticleComments (article_id);
|
|||||||
CREATE INDEX ArticleComments_comment_id_IDX ON ArticleComments (comment_id);
|
CREATE INDEX ArticleComments_comment_id_IDX ON ArticleComments (comment_id);
|
||||||
```
|
```
|
||||||
|
|
||||||
# OtherProducts
|
# LabelImages
|
||||||
The OtherProducts table will contain products for sale that are not Albums nor Tracks nor Collections.
|
|
||||||
|
|
||||||
``` sql
|
# LabelVideos
|
||||||
CREATE TABLE OtherProducts (
|
|
||||||
id TEXT(36),
|
|
||||||
name TEXT,
|
|
||||||
description TEXT,
|
|
||||||
created_by TEXT(36),
|
|
||||||
created_at INTEGER,
|
|
||||||
modified_by TEXT(36),
|
|
||||||
modified_at INTEGER,
|
|
||||||
deleted_by TEXT(36),
|
|
||||||
deleted_at INTEGER,
|
|
||||||
is_public INTEGER DEFAULT (0),
|
|
||||||
is_available INTEGER DEFAULT (0),
|
|
||||||
requires_shipping INTEGER DEFAULT (0),
|
|
||||||
CONSTRAINT OtherProducts_PK PRIMARY KEY (id),
|
|
||||||
CONSTRAINT OtherProducts_FK FOREIGN KEY (created_by) REFERENCES Persons(id),
|
|
||||||
CONSTRAINT OtherProducts_FK_1 FOREIGN KEY (modified_by) REFERENCES Persons(id),
|
|
||||||
CONSTRAINT OtherProducts_FK_2 FOREIGN KEY (deleted_by) REFERENCES Persons(id)
|
|
||||||
);
|
|
||||||
CREATE INDEX OtherProducts_name_IDX ON OtherProducts (name);
|
|
||||||
CREATE INDEX OtherProducts_description_IDX ON OtherProducts (description);
|
|
||||||
CREATE INDEX OtherProducts_created_by_IDX ON OtherProducts (created_by);
|
|
||||||
CREATE INDEX OtherProducts_created_at_IDX ON OtherProducts (created_at);
|
|
||||||
CREATE INDEX OtherProducts_modified_by_IDX ON OtherProducts (modified_by);
|
|
||||||
CREATE INDEX OtherProducts_modified_at_IDX ON OtherProducts (modified_at);
|
|
||||||
CREATE INDEX OtherProducts_deleted_by_IDX ON OtherProducts (deleted_by);
|
|
||||||
CREATE INDEX OtherProducts_deleted_at_IDX ON OtherProducts (deleted_at);
|
|
||||||
CREATE INDEX OtherProducts_is_public_IDX ON OtherProducts (is_public);
|
|
||||||
CREATE INDEX OtherProducts_is_available_IDX ON OtherProducts (is_available);
|
|
||||||
CREATE INDEX OtherProducts_requires_shipping_IDX ON OtherProducts (requires_shipping);
|
|
||||||
```
|
|
||||||
|
|
||||||
# Collections
|
# ArtistImages
|
||||||
The Collections table will contain Collections where each Collection is comprised of one or more Tracks, Albums, and/or OtherProducts packaged together for sale.
|
|
||||||
|
|
||||||
``` sql
|
# ArtistVideos
|
||||||
CREATE TABLE Collections (
|
|
||||||
id TEXT(36),
|
|
||||||
name TEXT,
|
|
||||||
description TEXT,
|
|
||||||
created_by TEXT(36),
|
|
||||||
created_at INTEGER,
|
|
||||||
modified_by TEXT(36),
|
|
||||||
modified_at INTEGER,
|
|
||||||
deleted_by TEXT(36),
|
|
||||||
deleted_at INTEGER,
|
|
||||||
is_public INTEGER DEFAULT (0),
|
|
||||||
is_available INTEGER DEFAULT (0),
|
|
||||||
CONSTRAINT Collections_PK PRIMARY KEY (id),
|
|
||||||
CONSTRAINT Collections_FK FOREIGN KEY (created_by) REFERENCES Persons(id),
|
|
||||||
CONSTRAINT Collections_FK_1 FOREIGN KEY (modified_by) REFERENCES Persons(id),
|
|
||||||
CONSTRAINT Collections_FK_2 FOREIGN KEY (deleted_by) REFERENCES Persons(id)
|
|
||||||
);
|
|
||||||
CREATE INDEX Collections_name_IDX ON Collections (name);
|
|
||||||
CREATE INDEX Collections_description_IDX ON Collections (description);
|
|
||||||
CREATE INDEX Collections_created_by_IDX ON Collections (created_by);
|
|
||||||
CREATE INDEX Collections_created_at_IDX ON Collections (created_at);
|
|
||||||
CREATE INDEX Collections_modified_by_IDX ON Collections (modified_by);
|
|
||||||
CREATE INDEX Collections_modified_at_IDX ON Collections (modified_at);
|
|
||||||
CREATE INDEX Collections_deleted_by_IDX ON Collections (deleted_by);
|
|
||||||
CREATE INDEX Collections_deleted_at_IDX ON Collections (deleted_at);
|
|
||||||
CREATE INDEX Collections_is_public_IDX ON Collections (is_public);
|
|
||||||
CREATE INDEX Collections_is_available_IDX ON Collections (is_available);
|
|
||||||
```
|
|
||||||
|
|
||||||
# CollectionAlbums
|
# AlbumImages
|
||||||
The CollectionAlbums table will relate a Collection to the Album(s) it contains.
|
|
||||||
|
|
||||||
``` sql
|
# AlbumVideos
|
||||||
CREATE TABLE CollectionAlbums (
|
|
||||||
collection_id TEXT(36),
|
|
||||||
album_id TEXT(36),
|
|
||||||
CONSTRAINT CollectionAlbums_PK PRIMARY KEY (collection_id,album_id),
|
|
||||||
CONSTRAINT CollectionAlbums_FK FOREIGN KEY (collection_id) REFERENCES Collections(id) ON DELETE CASCADE,
|
|
||||||
CONSTRAINT CollectionAlbums_FK_1 FOREIGN KEY (album_id) REFERENCES Albums(id) ON DELETE CASCADE
|
|
||||||
);
|
|
||||||
CREATE INDEX CollectionAlbums_collection_id_IDX ON CollectionAlbums (collection_id);
|
|
||||||
CREATE INDEX CollectionAlbums_album_id_IDX ON CollectionAlbums (album_id);
|
|
||||||
```
|
|
||||||
|
|
||||||
# CollectionTracks
|
# TrackImages
|
||||||
The CollectionTracks table will relate a Collection to the Track(s) it contains.
|
|
||||||
|
|
||||||
``` sql
|
# TrackVideos
|
||||||
CREATE TABLE CollectionTracks (
|
|
||||||
collection_id TEXT(36),
|
|
||||||
track_id TEXT(36),
|
|
||||||
CONSTRAINT CollectionTracks_PK PRIMARY KEY (collection_id,track_id),
|
|
||||||
CONSTRAINT CollectionTracks_FK FOREIGN KEY (collection_id) REFERENCES Collections(id) ON DELETE CASCADE,
|
|
||||||
CONSTRAINT CollectionTracks_FK_1 FOREIGN KEY (track_id) REFERENCES Tracks(id) ON DELETE CASCADE
|
|
||||||
);
|
|
||||||
CREATE INDEX CollectionTracks_collection_id_IDX ON CollectionTracks (collection_id);
|
|
||||||
CREATE INDEX CollectionTracks_track_id_IDX ON CollectionTracks (track_id);
|
|
||||||
```
|
|
||||||
|
|
||||||
# CollectionOtherProducts
|
# PlaylistImages
|
||||||
The CollectionOtherProducts table will relate a Collection to the OtherProduct(s) it contains.
|
|
||||||
|
|
||||||
``` sql
|
# PlaylistVideos
|
||||||
CREATE TABLE CollectionOtherProducts (
|
|
||||||
collection_id TEXT(36),
|
|
||||||
other_product_id TEXT(36),
|
|
||||||
CONSTRAINT CollectionOtherProducts_PK PRIMARY KEY (collection_id,other_product_id),
|
|
||||||
CONSTRAINT CollectionOtherProducts_FK FOREIGN KEY (collection_id) REFERENCES Collections(id) ON DELETE CASCADE,
|
|
||||||
CONSTRAINT CollectionOtherProducts_FK_1 FOREIGN KEY (other_product_id) REFERENCES OtherProducts(id) ON DELETE CASCADE
|
|
||||||
);
|
|
||||||
CREATE INDEX CollectionOtherProducts_collection_id_IDX ON CollectionOtherProducts (collection_id);
|
|
||||||
CREATE INDEX CollectionOtherProducts_other_product_id_IDX ON CollectionOtherProducts (other_product_id);
|
|
||||||
```
|
|
||||||
|
|
||||||
# Skus
|
# ArticleImages
|
||||||
The Skus table will contain SKUs () representing items available for Purchase through the server.
|
|
||||||
|
|
||||||
``` sql
|
# ArticleVideos
|
||||||
CREATE TABLE Skus (
|
|
||||||
id TEXT(36),
|
|
||||||
item_type TEXT,
|
|
||||||
item_id TEXT(36),
|
|
||||||
variant TEXT,
|
|
||||||
description TEXT,
|
|
||||||
price NUMERIC DEFAULT (0.00),
|
|
||||||
requires_shipping INTEGER DEFAULT (0),
|
|
||||||
shipping_charge NUMERIC DEFAULT (0.00),
|
|
||||||
CONSTRAINT Skus_PK PRIMARY KEY (id)
|
|
||||||
);
|
|
||||||
CREATE INDEX Skus_item_type_IDX ON Skus (item_type);
|
|
||||||
CREATE INDEX Skus_item_id_IDX ON Skus (item_id);
|
|
||||||
CREATE INDEX Skus_variant_IDX ON Skus (variant);
|
|
||||||
CREATE INDEX Skus_description_IDX ON Skus (description);
|
|
||||||
CREATE INDEX Skus_price_IDX ON Skus (price);
|
|
||||||
CREATE INDEX Skus_requires_shipping_IDX ON Skus (requires_shipping);
|
|
||||||
CREATE INDEX Skus_shipping_charge_IDX ON Skus (shipping_charge);
|
|
||||||
```
|
|
||||||
|
|
||||||
# LineItems
|
|
||||||
The LineItems table will contain individual SKUs and their associated quantites as part of a Purchase.
|
|
||||||
|
|
||||||
``` sql
|
|
||||||
CREATE TABLE LineItems (
|
|
||||||
id TEXT(36),
|
|
||||||
sku_id TEXT(36),
|
|
||||||
quantity INTEGER DEFAULT (1),
|
|
||||||
CONSTRAINT LineItems_PK PRIMARY KEY (id),
|
|
||||||
CONSTRAINT LineItems_FK FOREIGN KEY (sku_id) REFERENCES Skus(id)
|
|
||||||
);
|
|
||||||
CREATE INDEX LineItems_sku_id_IDX ON LineItems (sku_id);
|
|
||||||
CREATE INDEX LineItems_quantity_IDX ON LineItems (quantity);
|
|
||||||
```
|
|
||||||
|
|
||||||
# CouponCodes
|
|
||||||
The CouponCodes table will contain coupon codes that can be redeemed for a discount, either by amount or percentage, on a Purchase.
|
|
||||||
|
|
||||||
``` sql
|
|
||||||
CREATE TABLE CouponCodes (
|
|
||||||
id TEXT(36),
|
|
||||||
name TEXT,
|
|
||||||
code TEXT,
|
|
||||||
uses INTEGER DEFAULT (0),
|
|
||||||
max_uses INTEGER DEFAULT (0),
|
|
||||||
expiration INTEGER,
|
|
||||||
discount_flat NUMERIC DEFAULT (0.00),
|
|
||||||
discount_percentage NUMERIC DEFAULT (0.00),
|
|
||||||
is_sku_specific INTEGER DEFAULT (0),
|
|
||||||
is_active INTEGER DEFAULT (0),
|
|
||||||
created_by TEXT(36),
|
|
||||||
created_at INTEGER,
|
|
||||||
modified_by TEXT(36),
|
|
||||||
modified_at INTEGER,
|
|
||||||
deleted_by TEXT(36),
|
|
||||||
deleted_at INTEGER,
|
|
||||||
CONSTRAINT CouponCodes_PK PRIMARY KEY (id),
|
|
||||||
CONSTRAINT CouponCodes_FK FOREIGN KEY (created_by) REFERENCES Persons(id),
|
|
||||||
CONSTRAINT CouponCodes_FK_1 FOREIGN KEY (modified_by) REFERENCES Persons(id),
|
|
||||||
CONSTRAINT CouponCodes_FK_2 FOREIGN KEY (deleted_by) REFERENCES Persons(id)
|
|
||||||
);
|
|
||||||
CREATE INDEX CouponCodes_name_IDX ON CouponCodes (name);
|
|
||||||
CREATE UNIQUE INDEX CouponCodes_code_IDX ON CouponCodes (code);
|
|
||||||
CREATE INDEX CouponCodes_uses_IDX ON CouponCodes (uses);
|
|
||||||
CREATE INDEX CouponCodes_max_uses_IDX ON CouponCodes (max_uses);
|
|
||||||
CREATE INDEX CouponCodes_expiration_IDX ON CouponCodes (expiration);
|
|
||||||
CREATE INDEX CouponCodes_is_sku_specific_IDX ON CouponCodes (is_sku_specific);
|
|
||||||
CREATE INDEX CouponCodes_is_active_IDX ON CouponCodes (is_active);
|
|
||||||
CREATE INDEX CouponCodes_created_by_IDX ON CouponCodes (created_by);
|
|
||||||
CREATE INDEX CouponCodes_created_at_IDX ON CouponCodes (created_at);
|
|
||||||
CREATE INDEX CouponCodes_modified_by_IDX ON CouponCodes (modified_by);
|
|
||||||
CREATE INDEX CouponCodes_modified_at_IDX ON CouponCodes (modified_at);
|
|
||||||
CREATE INDEX CouponCodes_deleted_by_IDX ON CouponCodes (deleted_by);
|
|
||||||
CREATE INDEX CouponCodes_deleted_at_IDX ON CouponCodes (deleted_at);
|
|
||||||
```
|
|
||||||
|
|
||||||
# CouponCodeSkus
|
|
||||||
The CouponCodeSkus table will relate a CouponCode to one or more Skus the CouponCode can be applied to, if CouponCode.is_sku_specific is true. (If CouponCode.is_sku_specific is false the CouponCode can be applied to an entire Purchase regardless of the Skus being purchased.)
|
|
||||||
|
|
||||||
``` sql
|
|
||||||
CREATE TABLE CouponCodeSkus (
|
|
||||||
coupon_code_id TEXT(36),
|
|
||||||
sku_id TEXT(36),
|
|
||||||
CONSTRAINT CouponCodeSkus_PK PRIMARY KEY (coupon_code_id,sku_id),
|
|
||||||
CONSTRAINT CouponCodeSkus_FK FOREIGN KEY (coupon_code_id) REFERENCES CouponCodes(id),
|
|
||||||
CONSTRAINT CouponCodeSkus_FK_1 FOREIGN KEY (sku_id) REFERENCES Skus(id)
|
|
||||||
);
|
|
||||||
```
|
|
@ -1,7 +0,0 @@
|
|||||||
FROM rust:1.73-alpine3.18
|
|
||||||
|
|
||||||
#install build tooling
|
|
||||||
RUN apk add musl-dev && rustup component add rustfmt
|
|
||||||
|
|
||||||
# install gitea act_runner dependencies
|
|
||||||
RUN apk add nodejs git
|
|
@ -2,7 +2,8 @@ use warp::Filter;
|
|||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
async fn main() {
|
async fn main() {
|
||||||
let hello = warp::get().map(|| format!("Hello world!"));
|
let hello = warp::get()
|
||||||
|
.map(|| format!("Hello world!"));
|
||||||
|
|
||||||
warp::serve(hello).run(([127, 0, 0, 1], 5309)).await;
|
warp::serve(hello).run(([127, 0, 0, 1], 5309)).await;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user