Merge branch '26-restructure-part-2' into develop

master^2
Jef Roosens 2021-04-16 18:52:58 +02:00
commit 5534df00dc
Signed by: Jef Roosens
GPG Key ID: 955C0660072F691F
15 changed files with 61 additions and 52 deletions

View File

@ -2,7 +2,7 @@
# This hook lints the code, and if we're on develop or master, also forces the tests to pass. # This hook lints the code, and if we're on develop or master, also forces the tests to pass.
./fejctl lint &> /dev/null 2>&1 || { ./fejctl lint &> /dev/null 2>&1 || {
>&2 echo "Format check failed, use 'make lint' for more information."; >&2 echo "Format check failed, use './fejctl lint' for more information.";
exit 1; exit 1;
} }

View File

@ -6,7 +6,7 @@ edition = "2018"
[lib] [lib]
name = "fej" name = "fej"
src = "src/lib.rs" path = "src/fej/lib.rs"
test = true test = true
bench = true bench = true
doc = true doc = true
@ -14,10 +14,11 @@ doctest = true
[[bin]] [[bin]]
name = "server" name = "server"
src = "src/bin/server/main.rs" path = "src/server/main.rs"
test = false test = true
bench = false bench = true
doc = false doc = true
doctest = true
[dependencies] [dependencies]
rocket = "0.4.7" rocket = "0.4.7"

View File

@ -1,25 +1,17 @@
# Fej # Fej
Fej is an API written in Rust. I started this project to learn the language, Fej is a RESTful API that does lots of different things. It started as an
and really just have some fun. experiment to learn Rust, but has grown into a full-on passion project.
## Project Structure ## Project Structure
The folder structure follows the structure of the URLs, e.g. the route for The `src` folder contains subfolders for the various binaries and the main
`/hello/world` is found in the module `src/hello`. library, called `fej`. The biggest binary is called `server`, which is the
binary that actually runs the Rocket.rs web server. All the others are utility
programs, mostly consisting of scrapers for various services.
Each module contains the following base files: Version 1.1 also introduces the use of a database, namely
[PostgreSQL 13](https://www.postgresql.org/).
* `mod.rs`: defines the modules' content, and contains the route definitions.
The route functions themselves only contain the functionality needed to
represent the data, not acquire it.
* `controller.rs`: this file contains the actual logic of each route. If the
logic becomes too complicated to be contained inside a single file,
`controller.rs` becomes its own module folder named `controller`.
* `tests.rs`: this contains tests for the specific module. This can also be a
module directory if need be.
Every module has a `routes` function that returns its route macros.
## Roadmap ## Roadmap
@ -27,19 +19,33 @@ See [roadmap.md](roadmap.md).
## Development ## Development
The entire toolchain runs on Alpine inside Docker. This makes building easier, To make development more consistent (and keep my computer a bit cleaner) I've
and (hopefully) eliminates any system-specific bugs. decided to run the entire toolchain using Docker, with Alpine Linux base
images. This also allows me to make really small final images. Technically,
Docker is the only dependency you need to contribute to this project
(not accounting for language servers etc.).
A [Makefile wrapper](Makefile) is provided for ease of use. Do check it out, as A [Bash script](fejctl) is provided to speed up development on the various
all the commands are documented for your understanding ;) binaries. It aids in starting up the containers, choosing which binary to run
etc. A quick rundown of its most important features:
There's also the `build` script. This script does all the "heavy" lifting. It ```bash
chooses which Dockerfile to build according to the given arguments, and # By default, it compiles the 'server' binary (but doesn't run it)
generates tags for the images (useful when pushing releases). The Makefile is ./fejctl
really just a wrapper around this build script, allowing you to write
`make test` instead of `./build -m dev -a run test`.
tl;dr run `make run` to run your build, and `make test` to run the tests. # The first argument is the action you wish to perform, the second on which
# binary (not all commands need a binary as input, so they just ignore it)
# For example, this will run the binary called server
./fejctl r server
# This runs the tests (all commands also have their full name if you want)
./fejctl t
./fejctl test
# These attach to the two containers
./fejctl sh # Opens a new root shell inside the 'fej' container
./fejctl psql # Open a new psql shell in the fej database
```
## Docker images ## Docker images

View File

@ -69,8 +69,8 @@ setting up a database for this version anyways.
## Kissanime ## Kissanime
I like watching anime from time to time, and I've always used Kissanime for I like watching anime from time to time, and I've always used Kissanime for
this. However, their sites can be quite slow, and riddled with ads from time to this. However, their sites can be quite slow, and riddled with ads. That's why
time. That's why I'd like to create a high-speed wrapper that extracts all the I'd like to create a high-speed wrapper that extracts all the needed info from
needed info from their sites, removing the need for the user to ever actually their sites, removing the need for the user to ever actually visit their site.
visit their site. The API can just act as a fast search index, complete with The API can just act as a fast search index, complete with indexing of the
indexing of the links to the videos and everything. links to the videos and everything.

View File

@ -10,6 +10,8 @@ pub enum FejError {
FailedRequest, FailedRequest,
} }
// I'd love to move this over to the server binary, but right now, error E0117 is making that
// imopssible
impl From<FejError> for Status { impl From<FejError> for Status {
fn from(err: FejError) -> Status { fn from(err: FejError) -> Status {
match err { match err {

View File

@ -1,11 +1,7 @@
#![feature(proc_macro_hygiene, decl_macro)] #![feature(proc_macro_hygiene, decl_macro)]
#[macro_use]
extern crate rocket;
// Route modules // Route modules
pub mod ivago; pub mod ivago;
// Helper modules // Helper modules
pub mod catchers;
pub mod errors; pub mod errors;

View File

@ -1,7 +1,13 @@
#![feature(proc_macro_hygiene, decl_macro)]
#[macro_use] #[macro_use]
extern crate rocket; extern crate rocket;
use fej::{catchers, ivago}; #[cfg(test)]
mod tests;
mod catchers;
mod routes;
// Very temporary solution for CORS // Very temporary solution for CORS
// https://stackoverflow.com/questions/62412361/how-to-set-up-cors-or-options-for-rocket-rs // https://stackoverflow.com/questions/62412361/how-to-set-up-cors-or-options-for-rocket-rs
@ -33,7 +39,7 @@ impl Fairing for CORS {
fn rocket() -> rocket::Rocket { fn rocket() -> rocket::Rocket {
rocket::ignite() rocket::ignite()
.attach(CORS) .attach(CORS)
.mount("/ivago", ivago::routes()) .mount("/ivago", routes::ivago())
.register(catchers![catchers::not_found]) .register(catchers![catchers::not_found])
} }

View File

@ -1,14 +1,7 @@
mod controller; use fej::ivago::{get_pickup_times, search_streets, BasicDate, PickupTime, Street};
use controller::{get_pickup_times, search_streets};
use controller::{BasicDate, PickupTime, Street};
use rocket::http::Status; use rocket::http::Status;
use rocket_contrib::json::Json; use rocket_contrib::json::Json;
pub fn routes() -> Vec<rocket::Route> {
routes![route_search_streets, route_get_pickup_times]
}
/// This route handles the Ivago search endpoint. It returns a list of streets, /// This route handles the Ivago search endpoint. It returns a list of streets,
/// consisting of a street name & a city. /// consisting of a street name & a city.
/// ///

View File

@ -0,0 +1,5 @@
mod ivago;
pub fn ivago() -> Vec<rocket::Route> {
routes![ivago::route_search_streets, ivago::route_get_pickup_times]
}

View File

@ -3,7 +3,7 @@ use rocket::http::Status;
use rocket::local::Client; use rocket::local::Client;
fn rocket() -> rocket::Rocket { fn rocket() -> rocket::Rocket {
rocket::ignite().mount("/", fej_lib::ivago::routes()) rocket::ignite().mount("/", super::routes::ivago())
} }
/// Test 404 response /// Test 404 response