mcaptcha/api/v1/notifications/
add.rs

1// Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
2// SPDX-FileCopyrightText: 2023 Aravinth Manivannan <realaravinth@batsense.net>
3//
4// SPDX-License-Identifier: AGPL-3.0-or-later
5
6use actix_identity::Identity;
7use actix_web::{web, HttpResponse, Responder};
8use serde::{Deserialize, Serialize};
9
10use crate::errors::*;
11use crate::AppData;
12
13use db_core::AddNotification;
14
15#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
16pub struct AddNotificationRequest {
17    pub to: String,
18    pub heading: String,
19    pub message: String,
20}
21
22/// route handler that adds a notification message
23#[my_codegen::post(
24    path = "crate::V1_API_ROUTES.notifications.add",
25    wrap = "crate::api::v1::get_middleware()"
26)]
27pub async fn add_notification(
28    payload: web::Json<AddNotificationRequest>,
29    data: AppData,
30    id: Identity,
31) -> ServiceResult<impl Responder> {
32    let sender = id.identity().unwrap();
33    // TODO handle error where payload.to doesn't exist
34
35    let p = AddNotification {
36        from: &sender,
37        to: &payload.to,
38        message: &payload.message,
39        heading: &payload.heading,
40    };
41
42    data.db.create_notification(&p).await?;
43
44    Ok(HttpResponse::Ok())
45}
46
47#[cfg(test)]
48pub mod tests {
49    use actix_web::http::StatusCode;
50    use actix_web::test;
51
52    use super::*;
53    use crate::tests::*;
54    use crate::*;
55
56    #[actix_rt::test]
57    async fn notification_works_pg() {
58        let data = pg::get_data().await;
59        notification_works(data).await;
60    }
61
62    #[actix_rt::test]
63    async fn notification_works_maria() {
64        let data = maria::get_data().await;
65        notification_works(data).await;
66    }
67
68    pub async fn notification_works(data: ArcData) {
69        const NAME1: &str = "notifuser1";
70        const NAME2: &str = "notiuser2";
71        const PASSWORD: &str = "longpassworddomain";
72        const EMAIL1: &str = "testnotification1@a.com";
73        const EMAIL2: &str = "testnotification2@a.com";
74
75        let data = &data;
76
77        delete_user(data, NAME1).await;
78        delete_user(data, NAME2).await;
79
80        register_and_signin(data, NAME1, EMAIL1, PASSWORD).await;
81        register_and_signin(data, NAME2, EMAIL2, PASSWORD).await;
82        let (_creds, signin_resp) = signin(data, NAME1, PASSWORD).await;
83        let cookies = get_cookie!(signin_resp);
84        let app = get_app!(data).await;
85
86        let msg = AddNotificationRequest {
87            to: NAME2.into(),
88            heading: "Test notification".into(),
89            message: "Testing notifications with a dummy message".into(),
90        };
91
92        let send_notification_resp = test::call_service(
93            &app,
94            post_request!(&msg, V1_API_ROUTES.notifications.add)
95                .cookie(cookies.clone())
96                .to_request(),
97        )
98        .await;
99        assert_eq!(send_notification_resp.status(), StatusCode::OK);
100    }
101}