Skip to content

Commit 2eb8e31

Browse files
committed
add member status to details endpoint
1 parent f2a240a commit 2eb8e31

8 files changed

Lines changed: 40 additions & 21 deletions

File tree

openapi.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1241,6 +1241,9 @@ components:
12411241
curator:
12421242
type: boolean
12431243
example: true
1244+
member:
1245+
type: boolean
1246+
example: true
12441247
group:
12451248
$ref: "#/components/schemas/GroupWithTerms"
12461249
member_count:

src/api/groups.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ use actix_web::HttpResponse;
1616
use actix_web::Responder;
1717
use cis_client::CisClient;
1818
use dino_park_gate::scope::ScopeAndUser;
19+
use dino_park_trust::GroupsTrust;
1920
use log::info;
2021
use serde::Deserialize;
2122
use std::sync::Arc;
@@ -101,7 +102,10 @@ async fn group_details(
101102
scope_and_user: ScopeAndUser,
102103
) -> Result<HttpResponse, ApiError> {
103104
let host = operations::users::user_by_id(&pool, &scope_and_user.user_id)?;
104-
let curator = operations::admins::is_admin(&pool, &scope_and_user, &group_name, &host);
105+
let role = operations::members::role_for_current(&pool, &scope_and_user, &group_name)?;
106+
let curator = role.as_ref().map(|r| r.is_curator()).unwrap_or_default()
107+
|| scope_and_user.groups_scope == GroupsTrust::Admin;
108+
let is_member = role.is_some();
105109
let member_count = match operations::members::member_count(&pool, &group_name) {
106110
Ok(member_count) => member_count,
107111
Err(e) => return Err(ApiError::GenericBadRequest(e)),
@@ -128,6 +132,7 @@ async fn group_details(
128132
};
129133
let result = DisplayGroupDetails {
130134
curator,
135+
member: is_member,
131136
group: GroupInfo {
132137
name: group.group.name,
133138
description: group.group.description,

src/api/models.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ pub struct GroupInfo {
4040
#[derive(Serialize)]
4141
pub struct DisplayGroupDetails {
4242
pub curator: bool,
43+
pub member: bool,
4344
pub group: GroupInfo,
4445
pub member_count: i64,
4546
pub invitation_count: Option<i64>,

src/db/internal/member.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -206,14 +206,15 @@ pub fn role_for(
206206
connection: &PgConnection,
207207
user_uuid: &Uuid,
208208
group_name: &str,
209-
) -> Result<Role, Error> {
209+
) -> Result<Option<Role>, Error> {
210210
schema::memberships::table
211211
.filter(schema::memberships::user_uuid.eq(user_uuid))
212212
.inner_join(schema::groups::table)
213213
.filter(schema::groups::name.eq(group_name))
214214
.inner_join(schema::roles::table)
215-
.get_result::<(Membership, Group, Role)>(connection)
216-
.map(|(_, _, r)| r)
215+
.select(schema::roles::all_columns)
216+
.get_result::<Role>(connection)
217+
.optional()
217218
.map_err(Into::into)
218219
}
219220

src/db/operations/admins.rs

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -33,17 +33,6 @@ pub async fn add_admin(
3333
add_group_to_profile(cis_client, group_name_f, profile).await
3434
}
3535

36-
pub fn is_admin(pool: &Pool, scope_and_user: &ScopeAndUser, group_name: &str, host: &User) -> bool {
37-
HOST_IS_GROUP_ADMIN
38-
.run(&RuleContext::minimal(
39-
pool,
40-
scope_and_user,
41-
&group_name,
42-
&host.user_uuid,
43-
))
44-
.is_ok()
45-
}
46-
4736
pub fn demote(
4837
pool: &Pool,
4938
scope_and_user: &ScopeAndUser,

src/db/operations/members.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,3 +249,14 @@ pub fn renew(
249249
let connection = pool.get()?;
250250
internal::member::renew(&host.user_uuid, &connection, group_name, user, expiration)
251251
}
252+
253+
pub fn role_for_current(
254+
pool: &Pool,
255+
scope_and_user: &ScopeAndUser,
256+
group_name: &str,
257+
) -> Result<Option<RoleType>, Error> {
258+
let connection = pool.get()?;
259+
let user = internal::user::user_by_id(&connection, &scope_and_user.user_id)?;
260+
internal::member::role_for(&connection, &user.user_uuid, group_name)
261+
.map(|role| role.map(|role| role.typ))
262+
}

src/db/types.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,15 @@ pub enum RoleType {
9797
Member,
9898
}
9999

100+
impl RoleType {
101+
pub fn is_curator(&self) -> bool {
102+
match *self {
103+
Self::Admin | Self::Curator => true,
104+
Self::Member => false,
105+
}
106+
}
107+
}
108+
100109
#[derive(DbEnum, Debug, Deserialize, PartialEq, Serialize)]
101110
#[DieselType = "Group_type"]
102111
pub enum GroupType {

src/rules/functions.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ pub fn rule_is_creator(ctx: &RuleContext) -> Result<(), RuleError> {
3333
pub fn rule_host_can_invite(ctx: &RuleContext) -> Result<(), RuleError> {
3434
let connection = ctx.pool.get().map_err(|_| RuleError::PoolError)?;
3535
match internal::member::role_for(&connection, ctx.host_uuid, ctx.group) {
36-
Ok(role)
36+
Ok(Some(role))
3737
if role.typ == RoleType::Admin
3838
|| role.permissions.contains(&PermissionType::InviteMember) =>
3939
{
@@ -48,7 +48,7 @@ pub fn rule_host_can_invite(ctx: &RuleContext) -> Result<(), RuleError> {
4848
pub fn rule_host_can_remove(ctx: &RuleContext) -> Result<(), RuleError> {
4949
let connection = ctx.pool.get().map_err(|_| RuleError::PoolError)?;
5050
match internal::member::role_for(&connection, ctx.host_uuid, ctx.group) {
51-
Ok(role)
51+
Ok(Some(role))
5252
if role.typ == RoleType::Admin
5353
|| role.permissions.contains(&PermissionType::RemoveMember) =>
5454
{
@@ -115,7 +115,7 @@ pub fn current_user_can_join(ctx: &RuleContext) -> Result<(), RuleError> {
115115
pub fn rule_host_is_curator(ctx: &RuleContext) -> Result<(), RuleError> {
116116
let connection = ctx.pool.get().map_err(|_| RuleError::PoolError)?;
117117
match internal::member::role_for(&connection, ctx.host_uuid, ctx.group) {
118-
Ok(role) if role.typ == RoleType::Admin || role.typ == RoleType::Curator => Ok(()),
118+
Ok(Some(role)) if role.typ == RoleType::Admin || role.typ == RoleType::Curator => Ok(()),
119119
_ => Err(RuleError::NotACurator),
120120
}
121121
}
@@ -124,7 +124,7 @@ pub fn rule_host_is_curator(ctx: &RuleContext) -> Result<(), RuleError> {
124124
pub fn rule_host_is_group_admin(ctx: &RuleContext) -> Result<(), RuleError> {
125125
let connection = ctx.pool.get().map_err(|_| RuleError::PoolError)?;
126126
match internal::member::role_for(&connection, ctx.host_uuid, ctx.group) {
127-
Ok(role) if role.typ == RoleType::Admin => Ok(()),
127+
Ok(Some(role)) if role.typ == RoleType::Admin => Ok(()),
128128
_ => Err(RuleError::NotAnAdmin),
129129
}
130130
}
@@ -134,7 +134,7 @@ pub fn rule_user_has_member_role(ctx: &RuleContext) -> Result<(), RuleError> {
134134
let member_uuid = ctx.member_uuid.ok_or(RuleError::InvalidRuleContext)?;
135135
let connection = ctx.pool.get().map_err(|_| RuleError::PoolError)?;
136136
match internal::member::role_for(&connection, member_uuid, ctx.group) {
137-
Ok(role) if role.typ == RoleType::Member => Ok(()),
137+
Ok(Some(role)) if role.typ == RoleType::Member => Ok(()),
138138
_ => Err(RuleError::NotAnAdmin),
139139
}
140140
}
@@ -144,7 +144,7 @@ pub fn rule_user_has_member_role(ctx: &RuleContext) -> Result<(), RuleError> {
144144
pub fn rule_host_can_edit_terms(ctx: &RuleContext) -> Result<(), RuleError> {
145145
let connection = ctx.pool.get().map_err(|_| RuleError::PoolError)?;
146146
match internal::member::role_for(&connection, ctx.host_uuid, ctx.group) {
147-
Ok(role)
147+
Ok(Some(role))
148148
if role.typ == RoleType::Admin
149149
|| role.permissions.contains(&PermissionType::EditTerms) =>
150150
{

0 commit comments

Comments
 (0)