use std::str::FromStr; 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 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, Serialize, Deserialize)] pub struct AuthorizationParameters { response_type: ResponseType, redirect_uri: Option, } #[derive(Debug, Clone, Deserialize)] struct AuthorizeCredentials { username: Box, password: Box, } #[post("/authorize")] async fn authorize( query: web::Query, credentials: web::Form, ) -> HttpResponse { // TODO check that the URI is valid todo!() } #[get("/authorize")] async fn authorize_page( db: web::Data, tera: web::Data, translations: web::Data, query: web::Query, ) -> 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) } pub fn service() -> Scope { web::scope("/oauth") .service(authorize_page) .service(authorize) }