Merge branch '26-restructure-part-2' into develop
commit
5534df00dc
|
@ -2,7 +2,7 @@
|
|||
|
||||
# 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 || {
|
||||
>&2 echo "Format check failed, use 'make lint' for more information.";
|
||||
>&2 echo "Format check failed, use './fejctl lint' for more information.";
|
||||
exit 1;
|
||||
}
|
||||
|
||||
|
|
11
Cargo.toml
11
Cargo.toml
|
@ -6,7 +6,7 @@ edition = "2018"
|
|||
|
||||
[lib]
|
||||
name = "fej"
|
||||
src = "src/lib.rs"
|
||||
path = "src/fej/lib.rs"
|
||||
test = true
|
||||
bench = true
|
||||
doc = true
|
||||
|
@ -14,10 +14,11 @@ doctest = true
|
|||
|
||||
[[bin]]
|
||||
name = "server"
|
||||
src = "src/bin/server/main.rs"
|
||||
test = false
|
||||
bench = false
|
||||
doc = false
|
||||
path = "src/server/main.rs"
|
||||
test = true
|
||||
bench = true
|
||||
doc = true
|
||||
doctest = true
|
||||
|
||||
[dependencies]
|
||||
rocket = "0.4.7"
|
||||
|
|
58
README.md
58
README.md
|
@ -1,25 +1,17 @@
|
|||
# Fej
|
||||
|
||||
Fej is an API written in Rust. I started this project to learn the language,
|
||||
and really just have some fun.
|
||||
Fej is a RESTful API that does lots of different things. It started as an
|
||||
experiment to learn Rust, but has grown into a full-on passion project.
|
||||
|
||||
## Project Structure
|
||||
|
||||
The folder structure follows the structure of the URLs, e.g. the route for
|
||||
`/hello/world` is found in the module `src/hello`.
|
||||
The `src` folder contains subfolders for the various binaries and the main
|
||||
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:
|
||||
|
||||
* `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.
|
||||
Version 1.1 also introduces the use of a database, namely
|
||||
[PostgreSQL 13](https://www.postgresql.org/).
|
||||
|
||||
## Roadmap
|
||||
|
||||
|
@ -27,19 +19,33 @@ See [roadmap.md](roadmap.md).
|
|||
|
||||
## Development
|
||||
|
||||
The entire toolchain runs on Alpine inside Docker. This makes building easier,
|
||||
and (hopefully) eliminates any system-specific bugs.
|
||||
To make development more consistent (and keep my computer a bit cleaner) I've
|
||||
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
|
||||
all the commands are documented for your understanding ;)
|
||||
A [Bash script](fejctl) is provided to speed up development on the various
|
||||
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
|
||||
chooses which Dockerfile to build according to the given arguments, and
|
||||
generates tags for the images (useful when pushing releases). The Makefile is
|
||||
really just a wrapper around this build script, allowing you to write
|
||||
`make test` instead of `./build -m dev -a run test`.
|
||||
```bash
|
||||
# By default, it compiles the 'server' binary (but doesn't run it)
|
||||
./fejctl
|
||||
|
||||
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
|
||||
|
||||
|
|
10
roadmap.md
10
roadmap.md
|
@ -69,8 +69,8 @@ setting up a database for this version anyways.
|
|||
## Kissanime
|
||||
|
||||
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
|
||||
time. That's why I'd like to create a high-speed wrapper that extracts all the
|
||||
needed info from their sites, removing the need for the user to ever actually
|
||||
visit their site. The API can just act as a fast search index, complete with
|
||||
indexing of the links to the videos and everything.
|
||||
this. However, their sites can be quite slow, and riddled with ads. That's why
|
||||
I'd like to create a high-speed wrapper that extracts all the needed info from
|
||||
their sites, removing the need for the user to ever actually visit their site.
|
||||
The API can just act as a fast search index, complete with indexing of the
|
||||
links to the videos and everything.
|
||||
|
|
|
@ -10,6 +10,8 @@ pub enum FejError {
|
|||
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 {
|
||||
fn from(err: FejError) -> Status {
|
||||
match err {
|
|
@ -1,11 +1,7 @@
|
|||
#![feature(proc_macro_hygiene, decl_macro)]
|
||||
|
||||
#[macro_use]
|
||||
extern crate rocket;
|
||||
|
||||
// Route modules
|
||||
pub mod ivago;
|
||||
|
||||
// Helper modules
|
||||
pub mod catchers;
|
||||
pub mod errors;
|
|
@ -1,7 +1,13 @@
|
|||
#![feature(proc_macro_hygiene, decl_macro)]
|
||||
|
||||
#[macro_use]
|
||||
extern crate rocket;
|
||||
|
||||
use fej::{catchers, ivago};
|
||||
#[cfg(test)]
|
||||
mod tests;
|
||||
|
||||
mod catchers;
|
||||
mod routes;
|
||||
|
||||
// Very temporary solution for CORS
|
||||
// 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 {
|
||||
rocket::ignite()
|
||||
.attach(CORS)
|
||||
.mount("/ivago", ivago::routes())
|
||||
.mount("/ivago", routes::ivago())
|
||||
.register(catchers![catchers::not_found])
|
||||
}
|
||||
|
|
@ -1,14 +1,7 @@
|
|||
mod controller;
|
||||
|
||||
use controller::{get_pickup_times, search_streets};
|
||||
use controller::{BasicDate, PickupTime, Street};
|
||||
use fej::ivago::{get_pickup_times, search_streets, BasicDate, PickupTime, Street};
|
||||
use rocket::http::Status;
|
||||
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,
|
||||
/// consisting of a street name & a city.
|
||||
///
|
|
@ -0,0 +1,5 @@
|
|||
mod ivago;
|
||||
|
||||
pub fn ivago() -> Vec<rocket::Route> {
|
||||
routes![ivago::route_search_streets, ivago::route_get_pickup_times]
|
||||
}
|
|
@ -3,7 +3,7 @@ use rocket::http::Status;
|
|||
use rocket::local::Client;
|
||||
|
||||
fn rocket() -> rocket::Rocket {
|
||||
rocket::ignite().mount("/", fej_lib::ivago::routes())
|
||||
rocket::ignite().mount("/", super::routes::ivago())
|
||||
}
|
||||
|
||||
/// Test 404 response
|
Loading…
Reference in New Issue