Add assets microservice base
Signed-off-by: Nikolaos Karaolidis <nick@karaolidis.com>
This commit is contained in:
11
backend/common/Cargo.toml
Normal file
11
backend/common/Cargo.toml
Normal file
@@ -0,0 +1,11 @@
|
||||
[package]
|
||||
name = "common"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
apca = "0.27.2"
|
||||
deadpool = "0.9.5"
|
||||
serde = { version = "1.0.188", features = ["derive"] }
|
||||
sqlx = { version = "0.7.1", features = ["uuid", "time", "postgres"] }
|
||||
time = { version = "0.3.27", features = ["serde"] }
|
23
backend/common/src/alpaca.rs
Normal file
23
backend/common/src/alpaca.rs
Normal file
@@ -0,0 +1,23 @@
|
||||
use apca::{ApiInfo, Client};
|
||||
use deadpool::unmanaged::Pool;
|
||||
use std::error::Error;
|
||||
|
||||
pub type AlpacaPool = Pool<Client>;
|
||||
|
||||
pub fn create_alpaca_pool(
|
||||
apca_api_base_url: &str,
|
||||
apca_api_key_id: &str,
|
||||
apca_api_secret_key: &str,
|
||||
num_clients: usize,
|
||||
) -> Result<Pool<Client>, Box<dyn Error + Send + Sync>> {
|
||||
let mut alpaca_clients = Vec::new();
|
||||
for _ in 0..num_clients {
|
||||
let client = Client::new(ApiInfo::from_parts(
|
||||
apca_api_base_url,
|
||||
apca_api_key_id,
|
||||
apca_api_secret_key,
|
||||
)?);
|
||||
alpaca_clients.push(client);
|
||||
}
|
||||
Ok(Pool::from(alpaca_clients))
|
||||
}
|
89
backend/common/src/database.rs
Normal file
89
backend/common/src/database.rs
Normal file
@@ -0,0 +1,89 @@
|
||||
use serde::{Deserialize, Serialize};
|
||||
use sqlx::{error::BoxDynError, types::Uuid, Decode, Encode, FromRow, Postgres, Type};
|
||||
use std::ops::Deref;
|
||||
use time::PrimitiveDateTime;
|
||||
|
||||
macro_rules! impl_apca_sqlx_traits {
|
||||
($outer_type:ident, $inner_type:path, $fallback:expr) => {
|
||||
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
|
||||
pub struct $outer_type($inner_type);
|
||||
|
||||
impl Deref for $outer_type {
|
||||
type Target = $inner_type;
|
||||
|
||||
fn deref(&self) -> &Self::Target {
|
||||
&self.0
|
||||
}
|
||||
}
|
||||
|
||||
impl From<$inner_type> for $outer_type {
|
||||
fn from(inner: $inner_type) -> Self {
|
||||
$outer_type(inner)
|
||||
}
|
||||
}
|
||||
|
||||
impl From<String> for $outer_type {
|
||||
fn from(s: String) -> Self {
|
||||
s.parse().unwrap_or($fallback).into()
|
||||
}
|
||||
}
|
||||
|
||||
impl Decode<'_, Postgres> for $outer_type {
|
||||
fn decode(
|
||||
value: <Postgres as sqlx::database::HasValueRef<'_>>::ValueRef,
|
||||
) -> Result<Self, BoxDynError> {
|
||||
Ok($outer_type::from(<String as Decode<Postgres>>::decode(
|
||||
value,
|
||||
)?))
|
||||
}
|
||||
}
|
||||
|
||||
impl Encode<'_, Postgres> for $outer_type {
|
||||
fn encode_by_ref(
|
||||
&self,
|
||||
buf: &mut <Postgres as sqlx::database::HasArguments<'_>>::ArgumentBuffer,
|
||||
) -> sqlx::encode::IsNull {
|
||||
<String as Encode<Postgres>>::encode_by_ref(&self.0.as_ref().to_owned(), buf)
|
||||
}
|
||||
}
|
||||
|
||||
impl Type<Postgres> for $outer_type {
|
||||
fn type_info() -> <Postgres as sqlx::Database>::TypeInfo {
|
||||
<String as Type<Postgres>>::type_info()
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
impl_apca_sqlx_traits!(
|
||||
Class,
|
||||
apca::api::v2::asset::Class,
|
||||
apca::api::v2::asset::Class::Unknown
|
||||
);
|
||||
|
||||
impl_apca_sqlx_traits!(
|
||||
Exchange,
|
||||
apca::api::v2::asset::Exchange,
|
||||
apca::api::v2::asset::Exchange::Unknown
|
||||
);
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, FromRow, Serialize, Deserialize)]
|
||||
pub struct Asset {
|
||||
pub id: Uuid,
|
||||
pub symbol: String,
|
||||
pub class: Class,
|
||||
pub exchange: Exchange,
|
||||
pub trading: bool,
|
||||
pub date_added: PrimitiveDateTime,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, FromRow, Serialize, Deserialize)]
|
||||
pub struct Bar {
|
||||
pub timestamp: PrimitiveDateTime,
|
||||
pub symbol_id: Uuid,
|
||||
pub open: f64,
|
||||
pub high: f64,
|
||||
pub low: f64,
|
||||
pub close: f64,
|
||||
pub volume: u64,
|
||||
}
|
2
backend/common/src/lib.rs
Normal file
2
backend/common/src/lib.rs
Normal file
@@ -0,0 +1,2 @@
|
||||
pub mod alpaca;
|
||||
pub mod database;
|
Reference in New Issue
Block a user