Skip to content

Commit

Permalink
Added Rust API
Browse files Browse the repository at this point in the history
  • Loading branch information
jayy-lmao committed Dec 26, 2019
1 parent 04702f6 commit aacb989
Show file tree
Hide file tree
Showing 7 changed files with 2,078 additions and 1 deletion.
2 changes: 2 additions & 0 deletions api/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
/target
**/*.rs.bk
1,947 changes: 1,947 additions & 0 deletions api/Cargo.lock

Large diffs are not rendered by default.

16 changes: 16 additions & 0 deletions api/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
[package]
name = "readspacer-api"
version = "0.1.0"
authors = ["Jayy-Lmao <jameswarringtonholman@gmail.com>"]
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
postgres = "0.15.2"
actix-web = "1.0.7"
serde = { version = "1.0.101", features = ["derive"] }

[[bin]]
name = "readspacer-api"
path = "src/main.rs"
36 changes: 36 additions & 0 deletions api/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
FROM ekidd/rust-musl-builder AS build
WORKDIR /usr/src/
USER root

# install rustup/cargo
RUN curl https://sh.rustup.rs -sSf | sh -s -- -y
ENV PATH /root/.cargo/bin:$PATH

# Add compilation target for later scratch container
ENV RUST_TARGETS="x86_64-unknown-linux-musl"
RUN rustup target install x86_64-unknown-linux-musl

# Creating a placeholder project
RUN USER=root cargo new readspacer-api
WORKDIR /usr/src/readspacer-api

# moving deps info
COPY ./Cargo.lock ./Cargo.lock
COPY ./Cargo.toml ./Cargo.toml

# Caching deps
RUN cargo build --target x86_64-unknown-linux-musl --release
RUN rm target/x86_64-unknown-linux-musl/release/deps/readspacer*

# Replacing with actual src
RUN rm src/*.rs
COPY ./src ./src

# Only code changes should need to compile
RUN cargo build --target x86_64-unknown-linux-musl --release

# This creates a TINY container with the executable! Like 4-5mb srsly
FROM scratch
COPY --from=build /usr/src/readspacer-api/target/x86_64-unknown-linux-musl/release/readspacer-api .
USER 1000
CMD ["./readspacer-api"]
47 changes: 47 additions & 0 deletions api/src/main.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
use actix_web::{web, App, HttpServer, Responder};
use serde::Serialize;

mod person;

#[derive(Serialize)]
pub struct Person {
pub person_id: i32,
pub person_name: String
}

fn get_person_list() -> impl Responder {
let mut vec:Vec<Person> = Vec::new();
person::get_person_all(&mut vec);
web::Json(vec)
}

// Use i32 for int and serial in postgresql
fn get_person(info: web::Path<i32>) -> impl Responder {
let mut vec:Vec<Person> = Vec::new();
person::get_person_by_id(&mut vec, info.into_inner());
web::Json(vec)
}

fn greet() -> impl Responder {
"Yo there"
}

fn main() {
println!("Server starting...");
HttpServer::new(|| {
App::new()
.service(web::resource("/hello")
.route(web::get().to(greet)))
.service(web::resource("/persons/{person_id}")
.route(web::get().to(get_person)))
// .route(web::delete().to(delete_person))
// .route(web::put().to(update_person)))
.service(web::resource("/persons")
.route(web::get().to(get_person_list)))
// .route(web::post().to(create_person)))
})
.bind("0.0.0.0:8000")
.unwrap()
.run()
.unwrap();
}
30 changes: 30 additions & 0 deletions api/src/person.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
extern crate postgres;
use postgres::{Connection, TlsMode};
use std::env;
// static PG_CONNECTION_STRING: &str = "postgresql://jayy-lmao:yeetus@db:5442";

pub fn get_person_all(vec: &mut Vec<crate::Person>) {
let pg_connection_string = env::var("DATABASE_URI").expect("need a db uri");
println!("Connecting to {}", pg_connection_string);
let conn = Connection::connect(&pg_connection_string[..], TlsMode::None) .unwrap();
println!("Connection is fine");
for row in &conn.query("SELECT person_id, person_name FROM persons", &[]).unwrap() {
let person = crate::Person {
person_id: row.get(0),
person_name: row.get(1)
};
vec.push(person);
}
}

pub fn get_person_by_id(vec: &mut Vec<crate::Person>, id: i32) {
let pg_connection_string = env::var("DATABASE_URI").expect("need a db uri");
let conn = Connection::connect(&pg_connection_string[..], TlsMode::None) .unwrap();
for row in &conn.query("SELECT person_id, person_name FROM persons WHERE person_id = $1", &[&id]).unwrap() {
let person = crate::Person {
person_id: row.get(0),
person_name: row.get(1)
};
vec.push(person);
}
}
1 change: 0 additions & 1 deletion readspacer-api
Submodule readspacer-api deleted from fefe53

0 comments on commit aacb989

Please sign in to comment.