mirror of
https://github.com/n08i40k/schedule-parser-rusted.git
synced 2025-12-06 17:57:47 +03:00
Compare commits
1 Commits
master
...
e02cc4bca7
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e02cc4bca7 |
3
.github/workflows/build.yml
vendored
3
.github/workflows/build.yml
vendored
@@ -140,6 +140,3 @@ jobs:
|
|||||||
cache-to: type=gha,mode=max
|
cache-to: type=gha,mode=max
|
||||||
build-args: |
|
build-args: |
|
||||||
"BINARY_NAME=${{ env.BINARY_NAME }}"
|
"BINARY_NAME=${{ env.BINARY_NAME }}"
|
||||||
|
|
||||||
- name: Deploy
|
|
||||||
run: curl ${{ secrets.DEPLOY_URL }}
|
|
||||||
|
|||||||
9
Cargo.lock
generated
9
Cargo.lock
generated
@@ -1730,10 +1730,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592"
|
checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
"js-sys",
|
|
||||||
"libc",
|
"libc",
|
||||||
"wasi 0.11.1+wasi-snapshot-preview1",
|
"wasi 0.11.1+wasi-snapshot-preview1",
|
||||||
"wasm-bindgen",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -2380,16 +2378,17 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "jsonwebtoken"
|
name = "jsonwebtoken"
|
||||||
version = "9.3.1"
|
version = "10.1.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "5a87cc7a48537badeae96744432de36f4be2b4a34a05a5ef32e9dd8a1c169dde"
|
checksum = "3d119c6924272d16f0ab9ce41f7aa0bfef9340c00b0bb7ca3dd3b263d4a9150b"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"base64 0.22.1",
|
"base64 0.22.1",
|
||||||
|
"getrandom 0.2.16",
|
||||||
"js-sys",
|
"js-sys",
|
||||||
"pem",
|
"pem",
|
||||||
"ring",
|
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
|
"signature 2.2.0",
|
||||||
"simple_asn1",
|
"simple_asn1",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ futures-util = "0"
|
|||||||
|
|
||||||
# authorization
|
# authorization
|
||||||
bcrypt = "0"
|
bcrypt = "0"
|
||||||
jsonwebtoken = { version = "9", features = ["use_pem"] }
|
jsonwebtoken = { version = "10", features = ["use_pem"] }
|
||||||
|
|
||||||
# creating users
|
# creating users
|
||||||
objectid = "0"
|
objectid = "0"
|
||||||
|
|||||||
@@ -103,9 +103,6 @@ pub enum LessonType {
|
|||||||
|
|
||||||
/// Практическое занятие.
|
/// Практическое занятие.
|
||||||
Practice,
|
Practice,
|
||||||
|
|
||||||
/// Дифференцированный зачёт.
|
|
||||||
DifferentiatedExam,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Hash, Debug, Serialize, Deserialize, ToSchema)]
|
#[derive(Clone, Hash, Debug, Serialize, Deserialize, ToSchema)]
|
||||||
|
|||||||
@@ -187,7 +187,6 @@ fn guess_lesson_type(text: &str) -> Option<LessonType> {
|
|||||||
("курсовой проект", LessonType::CourseProject),
|
("курсовой проект", LessonType::CourseProject),
|
||||||
("защита курсового проекта", LessonType::CourseProjectDefense),
|
("защита курсового проекта", LessonType::CourseProjectDefense),
|
||||||
("практическое занятие", LessonType::Practice),
|
("практическое занятие", LessonType::Practice),
|
||||||
("дифференцированный зачет", LessonType::DifferentiatedExam),
|
|
||||||
])
|
])
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
17
src/main.rs
17
src/main.rs
@@ -50,22 +50,7 @@ pub fn get_api_scope<
|
|||||||
.service(routes::auth::sign_up_vk);
|
.service(routes::auth::sign_up_vk);
|
||||||
|
|
||||||
let users_scope = utoipa_actix_web::scope("/users")
|
let users_scope = utoipa_actix_web::scope("/users")
|
||||||
.wrap(
|
.wrap(JWTAuthorizationBuilder::new().build())
|
||||||
JWTAuthorizationBuilder::new()
|
|
||||||
.add_paths(
|
|
||||||
["/by/id/{id}", "/by/telegram-id/{id}"],
|
|
||||||
Some(ServiceConfig {
|
|
||||||
allow_service: true,
|
|
||||||
user_roles: Some(&[UserRole::Admin]),
|
|
||||||
}),
|
|
||||||
)
|
|
||||||
.build(),
|
|
||||||
)
|
|
||||||
.service(
|
|
||||||
utoipa_actix_web::scope("/by")
|
|
||||||
.service(routes::users::by::by_id)
|
|
||||||
.service(routes::users::by::by_telegram_id),
|
|
||||||
)
|
|
||||||
.service(routes::users::change_group)
|
.service(routes::users::change_group)
|
||||||
.service(routes::users::change_username)
|
.service(routes::users::change_username)
|
||||||
.service(routes::users::me);
|
.service(routes::users::me);
|
||||||
|
|||||||
@@ -5,13 +5,13 @@ use actix_web::body::{BoxBody, EitherBody};
|
|||||||
use actix_web::dev::{forward_ready, Service, ServiceRequest, ServiceResponse, Transform};
|
use actix_web::dev::{forward_ready, Service, ServiceRequest, ServiceResponse, Transform};
|
||||||
use actix_web::{web, Error, HttpRequest, ResponseError};
|
use actix_web::{web, Error, HttpRequest, ResponseError};
|
||||||
use database::entity::sea_orm_active_enums::UserRole;
|
use database::entity::sea_orm_active_enums::UserRole;
|
||||||
use database::entity::UserType;
|
|
||||||
use database::query::Query;
|
use database::query::Query;
|
||||||
use futures_util::future::LocalBoxFuture;
|
use futures_util::future::LocalBoxFuture;
|
||||||
use std::future::{ready, Ready};
|
use std::future::{ready, Ready};
|
||||||
use std::ops::Deref;
|
use std::ops::Deref;
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
use database::entity::UserType;
|
||||||
|
|
||||||
#[derive(Default, Clone)]
|
#[derive(Default, Clone)]
|
||||||
pub struct ServiceConfig {
|
pub struct ServiceConfig {
|
||||||
@@ -42,11 +42,7 @@ impl JWTAuthorizationBuilder {
|
|||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn add_paths(
|
pub fn add_paths(mut self, paths: impl AsRef<[&'static str]>, config: Option<ServiceConfig>) -> Self {
|
||||||
mut self,
|
|
||||||
paths: impl AsRef<[&'static str]>,
|
|
||||||
config: Option<ServiceConfig>,
|
|
||||||
) -> Self {
|
|
||||||
self.path_configs.push((Arc::from(paths.as_ref()), config));
|
self.path_configs.push((Arc::from(paths.as_ref()), config));
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
@@ -180,20 +176,11 @@ where
|
|||||||
fn call(&self, req: ServiceRequest) -> Self::Future {
|
fn call(&self, req: ServiceRequest) -> Self::Future {
|
||||||
let service = Rc::clone(&self.service);
|
let service = Rc::clone(&self.service);
|
||||||
|
|
||||||
let match_info = req.match_info();
|
let Some(config) = Self::find_config(
|
||||||
let path = if let Some(pattern) = req.match_pattern() {
|
req.match_info().unprocessed(),
|
||||||
let scope_start_idx = match_info
|
&self.path_configs,
|
||||||
.as_str()
|
&self.default_config,
|
||||||
.find(match_info.unprocessed())
|
) else {
|
||||||
.unwrap_or(0);
|
|
||||||
|
|
||||||
pattern.as_str().split_at(scope_start_idx).1.to_owned()
|
|
||||||
} else {
|
|
||||||
match_info.unprocessed().to_owned()
|
|
||||||
};
|
|
||||||
|
|
||||||
let Some(config) = Self::find_config(&path, &self.path_configs, &self.default_config)
|
|
||||||
else {
|
|
||||||
let fut = self.service.call(req);
|
let fut = self.service.call(req);
|
||||||
return Box::pin(async move { Ok(fut.await?.map_into_left_body()) });
|
return Box::pin(async move { Ok(fut.await?.map_into_left_body()) });
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -163,7 +163,6 @@ pub mod user {
|
|||||||
#[schema(examples(
|
#[schema(examples(
|
||||||
"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6IjY3ZGNjOWE5NTA3YjAwMDA3NzI3NDRhMiIsImlhdCI6IjE3NDMxMDgwOTkiLCJleHAiOiIxODY5MjUyMDk5In0.rMgXRb3JbT9AvLK4eiY9HMB5LxgUudkpQyoWKOypZFY"
|
"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6IjY3ZGNjOWE5NTA3YjAwMDA3NzI3NDRhMiIsImlhdCI6IjE3NDMxMDgwOTkiLCJleHAiOiIxODY5MjUyMDk5In0.rMgXRb3JbT9AvLK4eiY9HMB5LxgUudkpQyoWKOypZFY"
|
||||||
))]
|
))]
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
|
||||||
pub access_token: Option<String>,
|
pub access_token: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,56 +0,0 @@
|
|||||||
use crate::routes::schema::user::UserResponse;
|
|
||||||
use crate::routes::users::by::schema::{ErrorCode, ServiceResponse};
|
|
||||||
use crate::state::AppState;
|
|
||||||
use actix_web::{get, web};
|
|
||||||
use database::query::Query;
|
|
||||||
|
|
||||||
#[utoipa::path(responses((status = OK, body = UserResponse)))]
|
|
||||||
#[get("/id/{id}")]
|
|
||||||
pub async fn by_id(app_state: web::Data<AppState>, path: web::Path<String>) -> ServiceResponse {
|
|
||||||
let user_id = path.into_inner();
|
|
||||||
|
|
||||||
let db = app_state.get_database();
|
|
||||||
|
|
||||||
match Query::find_user_by_id(db, &user_id).await {
|
|
||||||
Ok(Some(user)) => Ok(UserResponse::from(user)),
|
|
||||||
_ => Err(ErrorCode::NotFound),
|
|
||||||
}
|
|
||||||
.into()
|
|
||||||
}
|
|
||||||
|
|
||||||
#[utoipa::path(responses((status = OK, body = UserResponse)))]
|
|
||||||
#[get("/telegram-id/{id}")]
|
|
||||||
pub async fn by_telegram_id(
|
|
||||||
app_state: web::Data<AppState>,
|
|
||||||
path: web::Path<i64>,
|
|
||||||
) -> ServiceResponse {
|
|
||||||
let telegram_id = path.into_inner();
|
|
||||||
|
|
||||||
let db = app_state.get_database();
|
|
||||||
|
|
||||||
match Query::find_user_by_telegram_id(db, telegram_id).await {
|
|
||||||
Ok(Some(user)) => Ok(UserResponse::from(user)),
|
|
||||||
_ => Err(ErrorCode::NotFound),
|
|
||||||
}
|
|
||||||
.into()
|
|
||||||
}
|
|
||||||
|
|
||||||
mod schema {
|
|
||||||
use crate::routes::schema::user::UserResponse;
|
|
||||||
use actix_macros::ErrResponse;
|
|
||||||
use derive_more::Display;
|
|
||||||
use serde::Serialize;
|
|
||||||
use utoipa::ToSchema;
|
|
||||||
|
|
||||||
pub type ServiceResponse = crate::routes::schema::Response<UserResponse, ErrorCode>;
|
|
||||||
|
|
||||||
#[derive(Clone, Serialize, Display, ToSchema, ErrResponse)]
|
|
||||||
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
|
|
||||||
#[schema(as = Users::By::ErrorCode)]
|
|
||||||
pub enum ErrorCode {
|
|
||||||
/// User not found.
|
|
||||||
#[status_code = "actix_web::http::StatusCode::NOT_FOUND"]
|
|
||||||
#[display("Required user not found.")]
|
|
||||||
NotFound,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,3 @@
|
|||||||
pub mod by;
|
|
||||||
mod change_group;
|
mod change_group;
|
||||||
mod change_username;
|
mod change_username;
|
||||||
mod me;
|
mod me;
|
||||||
|
|||||||
Reference in New Issue
Block a user