summaryrefslogtreecommitdiff
path: root/src/api
diff options
context:
space:
mode:
Diffstat (limited to 'src/api')
-rw-r--r--src/api/mod.rs9
-rw-r--r--src/api/oauth.rs60
-rw-r--r--src/api/ops.rs13
3 files changed, 55 insertions, 27 deletions
diff --git a/src/api/mod.rs b/src/api/mod.rs
index 3d74be8..0ab4037 100644
--- a/src/api/mod.rs
+++ b/src/api/mod.rs
@@ -1,10 +1,13 @@
+mod clients;
mod liveops;
+mod oauth;
mod ops;
mod users;
-mod oauth;
-mod clients;
+pub use clients::service as clients;
pub use liveops::service as liveops;
+pub use oauth::service as oauth;
pub use ops::service as ops;
pub use users::service as users;
-pub use clients::service as clients;
+
+pub use oauth::AuthorizationParameters;
diff --git a/src/api/oauth.rs b/src/api/oauth.rs
index 9e0e5c6..9916053 100644
--- a/src/api/oauth.rs
+++ b/src/api/oauth.rs
@@ -1,24 +1,60 @@
-use std::collections::HashMap;
+use std::str::FromStr;
-use actix_web::{web, HttpResponse};
-use serde::Deserialize;
+use actix_web::{get, post, web, HttpResponse, Scope};
+use serde::{Deserialize, Serialize};
+use sqlx::MySqlPool;
+use tera::Tera;
+use unic_langid::subtags::Language;
use url::Url;
-use uuid::Uuid;
-#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize)]
+use crate::resources::{languages, templates};
+use crate::services::db;
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
enum ResponseType {
Code,
Token,
}
-#[derive(Debug, Clone, Deserialize)]
-struct AuthorizationParameters {
+#[derive(Debug, Clone, Serialize, Deserialize)]
+pub struct AuthorizationParameters {
response_type: ResponseType,
- client_id: Uuid,
- redirect_uri: Url,
- state: Box<str>,
+ redirect_uri: Option<Url>,
+}
+
+#[derive(Debug, Clone, Deserialize)]
+struct AuthorizeCredentials {
+ username: Box<str>,
+ password: Box<str>,
+}
+
+#[post("/authorize")]
+async fn authorize(
+ query: web::Query<AuthorizationParameters>,
+ credentials: web::Form<AuthorizeCredentials>,
+) -> HttpResponse {
+ // TODO check that the URI is valid
+ todo!()
+}
+
+#[get("/authorize")]
+async fn authorize_page(
+ db: web::Data<MySqlPool>,
+ tera: web::Data<Tera>,
+ translations: web::Data<languages::Translations>,
+ query: web::Query<AuthorizationParameters>,
+) -> HttpResponse {
+ // TODO find a better way of doing languages
+ // TODO check that the URI is valid
+ let language = Language::from_str("en").unwrap();
+ let page =
+ templates::login_page(&tera, &query, language, translations.get_ref().clone()).unwrap();
+ HttpResponse::Ok().content_type("text/html").body(page)
+}
- #[serde(flatten)]
- additional_parameters: HashMap<Box<str>, Box<str>>,
+pub fn service() -> Scope {
+ web::scope("/oauth")
+ .service(authorize_page)
+ .service(authorize)
}
diff --git a/src/api/ops.rs b/src/api/ops.rs
index d947e64..555bb1b 100644
--- a/src/api/ops.rs
+++ b/src/api/ops.rs
@@ -65,17 +65,6 @@ async fn login(
Ok(response)
}
-#[get("/login")]
-async fn login_page(
- tera: web::Data<Tera>,
- translations: web::Data<languages::Translations>,
-) -> HttpResponse {
- // TODO find a better way of doing this
- let language = Language::from_str("en").unwrap();
- let page = templates::login_page(&tera, language, translations.get_ref().clone()).unwrap();
- HttpResponse::Ok().content_type("text/html").body(page)
-}
-
pub fn service() -> Scope {
- web::scope("").service(login).service(login_page)
+ web::scope("").service(login)
}