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