A decentralized music tracking and discovery platform built on AT Protocol 馃幍 rocksky.app
spotify atproto lastfm musicbrainz scrobbling listenbrainz
at main 76 lines 2.1 kB view raw
1use std::env; 2 3use actix_web::{ 4 get, post, 5 web::{self, Data}, 6 App, HttpRequest, HttpResponse, HttpServer, Responder, 7}; 8use anyhow::Error; 9use owo_colors::OwoColorize; 10use s3::{creds::Credentials, Bucket, Region}; 11use serde_json::json; 12 13use crate::handlers::handle; 14 15#[get("/")] 16async fn index(_req: HttpRequest) -> HttpResponse { 17 HttpResponse::Ok().json(json!({ 18 "server": "Rocksky Storage Server", 19 "version": "0.1.0", 20 })) 21} 22 23#[post("/{method}")] 24async fn call_method( 25 data: web::Data<Box<Bucket>>, 26 mut payload: web::Payload, 27 req: HttpRequest, 28) -> Result<impl Responder, actix_web::Error> { 29 let method = req.match_info().get("method").unwrap_or("unknown"); 30 println!("Method: {}", method.bright_green()); 31 32 let bucket = data.get_ref().clone(); 33 handle(method, &mut payload, &req, bucket) 34 .await 35 .map_err(actix_web::error::ErrorInternalServerError) 36} 37 38pub async fn serve() -> Result<(), Error> { 39 let host = env::var("STORAGE_HOST").unwrap_or_else(|_| "127.0.0.1".to_string()); 40 let port = env::var("STORAGE_PORT").unwrap_or_else(|_| "7883".to_string()); 41 let addr = format!("{}:{}", host, port); 42 43 let url = format!("http://{}", addr); 44 println!("Listening on {}", url.bright_green()); 45 46 let access_key = std::env::var("ACCESS_KEY").expect("ACCESS_KEY not set"); 47 let secret_key = std::env::var("SECRET_KEY").expect("SECRET_KEY not set"); 48 let bucket_name = std::env::var("BUCKET_NAME").expect("BUCKET_NAME not set"); 49 let account_id = std::env::var("ACCOUNT_ID").expect("ACCOUNT_ID not set"); 50 51 let bucket = Bucket::new( 52 &bucket_name, 53 Region::R2 { account_id }, 54 Credentials::new( 55 Some(access_key.as_str()), 56 Some(secret_key.as_str()), 57 None, 58 None, 59 None, 60 )?, 61 )? 62 .with_path_style(); 63 64 HttpServer::new(move || { 65 App::new() 66 .app_data(Data::new(bucket.clone())) 67 .service(index) 68 .service(call_method) 69 }) 70 .bind(&addr)? 71 .run() 72 .await 73 .map_err(Error::new)?; 74 75 Ok(()) 76}