staging #209
| @@ -11,7 +11,7 @@ env: | |||||||
| jobs: | jobs: | ||||||
|   test: |   test: | ||||||
|     runs-on: ubuntu-latest |     runs-on: ubuntu-latest | ||||||
|     container: git.hofer.link/ruderverein-donau-linz/rowing-ci:20240118 |     container: git.hofer.link/ruderverein-donau-linz/rowing-ci:20240215 | ||||||
|     steps: |     steps: | ||||||
|     - uses: actions/checkout@v3 |     - uses: actions/checkout@v3 | ||||||
|     - name: Run Test DB Script |     - name: Run Test DB Script | ||||||
| @@ -46,7 +46,7 @@ jobs: | |||||||
|  |  | ||||||
|   deploy-staging: |   deploy-staging: | ||||||
|     runs-on: ubuntu-latest |     runs-on: ubuntu-latest | ||||||
|     container: git.hofer.link/ruderverein-donau-linz/rowing-ci:20240118 |     container: git.hofer.link/ruderverein-donau-linz/rowing-ci:20240215 | ||||||
|     needs: [test] |     needs: [test] | ||||||
|     if: github.ref == 'refs/heads/staging' |     if: github.ref == 'refs/heads/staging' | ||||||
|     steps: |     steps: | ||||||
| @@ -97,7 +97,7 @@ jobs: | |||||||
|  |  | ||||||
|   deploy-main: |   deploy-main: | ||||||
|     runs-on: ubuntu-latest |     runs-on: ubuntu-latest | ||||||
|     container: git.hofer.link/ruderverein-donau-linz/rowing-ci:20240118 |     container: git.hofer.link/ruderverein-donau-linz/rowing-ci:20240215 | ||||||
|     needs: [test] |     needs: [test] | ||||||
|     if: github.ref == 'refs/heads/main' |     if: github.ref == 'refs/heads/main' | ||||||
|     steps: |     steps: | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ | |||||||
| # 2. Tag the image: `docker tag <id> git.hofer.link/ruderverein-donau-linz/rowing-ci:<date>` | # 2. Tag the image: `docker tag <id> git.hofer.link/ruderverein-donau-linz/rowing-ci:<date>` | ||||||
| # 3. Push the image: `docker push git.hofer.link/ruderverein-donau-linz/rowing-ci:<date>` | # 3. Push the image: `docker push git.hofer.link/ruderverein-donau-linz/rowing-ci:<date>` | ||||||
|  |  | ||||||
| FROM rust:1.75.0 | FROM rust:1.76 | ||||||
|  |  | ||||||
| RUN apt-get update && apt-get install -y sqlite3 | RUN apt-get update && apt-get install -y sqlite3 | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,8 +1,9 @@ | |||||||
| use std::error::Error; | use std::{error::Error, fs}; | ||||||
|  |  | ||||||
| use lettre::{ | use lettre::{ | ||||||
|     message::header::ContentType, transport::smtp::authentication::Credentials, Message, |     message::{header::ContentType, Attachment, MultiPart, SinglePart}, | ||||||
|     SmtpTransport, Transport, |     transport::smtp::authentication::Credentials, | ||||||
|  |     Message, SmtpTransport, Transport, | ||||||
| }; | }; | ||||||
| use sqlx::SqlitePool; | use sqlx::SqlitePool; | ||||||
|  |  | ||||||
| @@ -13,7 +14,7 @@ use super::{family::Family, log::Log, role::Role, user::User}; | |||||||
| pub struct Mail {} | pub struct Mail {} | ||||||
|  |  | ||||||
| impl Mail { | impl Mail { | ||||||
|     pub async fn send(db: &SqlitePool, data: MailToSend, smtp_pw: String) -> bool { |     pub async fn send(db: &SqlitePool, data: MailToSend<'_>, smtp_pw: String) -> bool { | ||||||
|         let mut email = Message::builder() |         let mut email = Message::builder() | ||||||
|             .from( |             .from( | ||||||
|                 "ASKÖ Ruderverein Donau Linz <no-reply@rudernlinz.at>" |                 "ASKÖ Ruderverein Donau Linz <no-reply@rudernlinz.at>" | ||||||
| @@ -45,13 +46,23 @@ impl Mail { | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         // TODO: handle attachments |         let mut multipart = MultiPart::mixed().singlepart(SinglePart::plain(data.body)); | ||||||
|  |  | ||||||
|         let email = email |         for temp_file in &data.files { | ||||||
|             .subject(data.subject) |             let content = fs::read(temp_file.path().unwrap()).unwrap(); | ||||||
|             .header(ContentType::TEXT_PLAIN) |             let media_type = format!("{}", temp_file.content_type().unwrap().media_type()); | ||||||
|             .body(String::from(data.body)) |             let content_type = ContentType::parse(&media_type).unwrap(); | ||||||
|             .unwrap(); |             let attachment = Attachment::new(format!( | ||||||
|  |                 "{}.{}", | ||||||
|  |                 temp_file.name().unwrap(), | ||||||
|  |                 temp_file.content_type().unwrap().extension().unwrap() | ||||||
|  |             )) | ||||||
|  |             .body(content, content_type); | ||||||
|  |  | ||||||
|  |             multipart = multipart.singlepart(attachment); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         let email = email.subject(data.subject).multipart(multipart).unwrap(); | ||||||
|  |  | ||||||
|         let creds = Credentials::new("no-reply@rudernlinz.at".to_owned(), smtp_pw); |         let creds = Credentials::new("no-reply@rudernlinz.at".to_owned(), smtp_pw); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -51,7 +51,7 @@ WHERE name like ? | |||||||
|          FROM user u |          FROM user u | ||||||
|          JOIN user_role ur ON u.id = ur.user_id |          JOIN user_role ur ON u.id = ur.user_id | ||||||
|          JOIN role r ON ur.role_id = r.id |          JOIN role r ON ur.role_id = r.id | ||||||
|          WHERE r.id = {}", |          WHERE r.id = {} AND deleted=0;", | ||||||
|             self.id |             self.id | ||||||
|         ); |         ); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,4 +1,5 @@ | |||||||
| use rocket::form::Form; | use rocket::form::Form; | ||||||
|  | use rocket::fs::TempFile; | ||||||
| use rocket::response::{Flash, Redirect}; | use rocket::response::{Flash, Redirect}; | ||||||
| use rocket::{get, request::FlashMessage, routes, Route, State}; | use rocket::{get, request::FlashMessage, routes, Route, State}; | ||||||
| use rocket::{post, FromForm}; | use rocket::{post, FromForm}; | ||||||
| @@ -39,18 +40,17 @@ async fn fee(db: &State<SqlitePool>, _admin: AdminUser, config: &State<Config>) | |||||||
| } | } | ||||||
|  |  | ||||||
| #[derive(FromForm, Debug)] | #[derive(FromForm, Debug)] | ||||||
| pub struct MailToSend { | pub struct MailToSend<'a> { | ||||||
|     //<'a> { |  | ||||||
|     pub(crate) role_id: i32, |     pub(crate) role_id: i32, | ||||||
|     pub(crate) subject: String, |     pub(crate) subject: String, | ||||||
|     pub(crate) body: String, |     pub(crate) body: String, | ||||||
|     //pub(crate) files: Vec<TempFile<'a>>, |     pub(crate) files: Vec<TempFile<'a>>, | ||||||
| } | } | ||||||
|  |  | ||||||
| #[post("/mail", data = "<data>")] | #[post("/mail", data = "<data>")] | ||||||
| async fn update( | async fn update( | ||||||
|     db: &State<SqlitePool>, |     db: &State<SqlitePool>, | ||||||
|     data: Form<MailToSend>, |     data: Form<MailToSend<'_>>, | ||||||
|     config: &State<Config>, |     config: &State<Config>, | ||||||
|     _admin: AdminUser, |     _admin: AdminUser, | ||||||
| ) -> Flash<Redirect> { | ) -> Flash<Redirect> { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user