A decentralized music tracking and discovery platform built on AT Protocol 馃幍
rocksky.app
spotify
atproto
lastfm
musicbrainz
scrobbling
listenbrainz
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}