• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

divviup / divviup-api / 6163126471

12 Sep 2023 05:57PM UTC coverage: 59.318% (+0.02%) from 59.3%
6163126471

push

github

web-flow
Bump @types/node from 20.5.9 to 20.6.0 in /app (#478)

3358 of 5661 relevant lines covered (59.32%)

134.33 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

96.36
/src/routes/memberships.rs
1
use crate::{
2
    entity::{Account, CreateMembership, Membership, MembershipColumn, Memberships},
3
    queue::Job,
4
    Db, Error, PermissionsActor,
5
};
6
use sea_orm::{
7
    sea_query::all, ActiveModelTrait, ColumnTrait, EntityTrait, ModelTrait, QueryFilter,
8
    TransactionTrait,
9
};
10
use trillium::{Conn, Handler, Status};
11
use trillium_api::Json;
12

13
use trillium_router::RouterConnExt;
14
use uuid::Uuid;
15

16
pub async fn index(_: &mut Conn, (account, db): (Account, Db)) -> Result<impl Handler, Error> {
5✔
17
    account
5✔
18
        .find_related(Memberships)
5✔
19
        .all(&db)
5✔
20
        .await
9✔
21
        .map_err(Error::from)
5✔
22
        .map(Json)
5✔
23
}
5✔
24

25
pub async fn create(
7✔
26
    _: &mut Conn,
7✔
27
    (account, Json(membership), db): (Account, Json<CreateMembership>, Db),
7✔
28
) -> Result<(Json<Membership>, Status), Error> {
7✔
29
    let membership = membership.build(&account)?;
7✔
30
    if let Some(membership) = Memberships::find()
6✔
31
        .filter(all![
6✔
32
            MembershipColumn::AccountId.eq(*membership.account_id.as_ref()),
6✔
33
            MembershipColumn::UserEmail.eq(membership.user_email.as_ref())
6✔
34
        ])
6✔
35
        .one(&db)
6✔
36
        .await?
3✔
37
    {
38
        return Ok((Json(membership), Status::Ok));
1✔
39
    }
5✔
40

41
    let tx = db.begin().await?;
5✔
42

43
    let first_membership_for_this_email = Memberships::find()
5✔
44
        .filter(MembershipColumn::UserEmail.eq(membership.user_email.as_ref()))
5✔
45
        .one(&tx)
5✔
46
        .await?
×
47
        .is_none();
5✔
48

49
    let membership = membership.insert(&tx).await?;
5✔
50

51
    if first_membership_for_this_email && !cfg!(feature = "integration-testing") {
5✔
52
        Job::new_invitation_flow(&membership).insert(&tx).await?;
5✔
53
    }
×
54

55
    tx.commit().await?;
5✔
56

57
    Ok((Json(membership), Status::Created))
5✔
58
}
7✔
59

60
pub async fn delete(
9✔
61
    conn: &mut Conn,
9✔
62
    (actor, db): (PermissionsActor, Db),
9✔
63
) -> Result<impl Handler, Error> {
9✔
64
    let membership_id = conn
9✔
65
        .param("membership_id")
9✔
66
        .unwrap()
9✔
67
        .parse::<Uuid>()
9✔
68
        .map_err(|_| Error::NotFound)?;
9✔
69

70
    let membership = Memberships::find_by_id(membership_id)
9✔
71
        .one(&db)
9✔
72
        .await?
7✔
73
        .ok_or(Error::NotFound)?;
9✔
74

75
    if matches!(&actor, PermissionsActor::User(user, _) if membership.user_email == user.email) {
4✔
76
        Err(Error::AccessDenied)
1✔
77
    } else if actor.is_admin() || actor.account_ids().contains(&membership.account_id) {
7✔
78
        membership.delete(&db).await?;
6✔
79
        Ok(Status::NoContent)
5✔
80
    } else {
81
        Err(Error::NotFound)
2✔
82
    }
83
}
9✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc