Skip to content

Commit

Permalink
feat(fe/admin): Functionality to update or change a schools internal …
Browse files Browse the repository at this point in the history
…school name
  • Loading branch information
johnnynotsolucky committed Aug 8, 2023
1 parent 70633ea commit a9c2609
Show file tree
Hide file tree
Showing 18 changed files with 607 additions and 166 deletions.
167 changes: 93 additions & 74 deletions backend/api/sqlx-data.json
Original file line number Diff line number Diff line change
Expand Up @@ -3871,6 +3871,30 @@
},
"query": "\nwith cte as (\n select id as \"resource_id\",\n creator_id,\n author_id,\n likes,\n views,\n live_up_to_date,\n case\n when $2 = 0 then resource.draft_id\n when $2 = 1 then resource.live_id\n end as \"draft_or_live_id\",\n published_at,\n rating,\n blocked,\n curated,\n is_premium\n from resource\n left join resource_admin_data \"admin\" on admin.resource_id = resource.id\n where id = $1\n)\nselect cte.resource_id as \"resource_id: ResourceId\",\n display_name,\n creator_id as \"creator_id: UserId\",\n author_id as \"author_id: UserId\",\n (select given_name || ' '::text || family_name\n from user_profile\n where user_profile.user_id = author_id) as \"author_name\",\n created_at,\n updated_at,\n published_at,\n privacy_level as \"privacy_level!: PrivacyLevel\",\n language,\n description,\n translated_description as \"translated_description!: Json<HashMap<String, String>>\",\n likes,\n views,\n live_up_to_date,\n locked,\n other_keywords,\n translated_keywords,\n rating as \"rating?: ResourceRating\",\n blocked as \"blocked\",\n exists(select 1 from resource_like where resource_id = $1 and user_id = $3) as \"is_liked!\",\n curated,\n is_premium as \"premium\",\n (\n select row(resource_data_module.id, kind, is_complete)\n from resource_data_module\n where resource_data_id = resource_data.id\n ) as \"cover?: (ModuleId, ModuleKind, bool)\",\n array(select row (category_id)\n from resource_data_category\n where resource_data_id = cte.draft_or_live_id) as \"categories!: Vec<(CategoryId,)>\",\n array(select row (affiliation_id)\n from resource_data_affiliation\n where resource_data_id = cte.draft_or_live_id) as \"affiliations!: Vec<(AffiliationId,)>\",\n array(select row (age_range_id)\n from resource_data_age_range\n where resource_data_id = cte.draft_or_live_id) as \"age_ranges!: Vec<(AgeRangeId,)>\",\n array(\n select row (rdr.id, rdr.display_name, resource_type_id, resource_content)\n from resource_data_resource \"rdr\"\n where rdr.resource_data_id = cte.draft_or_live_id\n ) as \"additional_resource!: Vec<(AddId, String, TypeId, Value)>\"\nfrom resource_data\n inner join cte on cte.draft_or_live_id = resource_data.id\n"
},
"39f55f10f1724f0dabb080c898e7314b6a792e0c0c0912e3572018335d3bd4f6": {
"describe": {
"columns": [
{
"name": "id!: SchoolNameId",
"ordinal": 0,
"type_info": "Uuid"
},
{
"name": "name!",
"ordinal": 1,
"type_info": "Text"
}
],
"nullable": [
false,
null
],
"parameters": {
"Left": []
}
},
"query": "\nselect\n school_name.school_name_id as \"id!: SchoolNameId\",\n school_name.name::text as \"name!\"\nfrom school_name\nleft join school on school_name.school_name_id = school.internal_school_name_id\nwhere\n school.school_id is null\n"
},
"39f64cd116aebc8283a0b732722a5d198b6e48d255c1f3de2ad0919bee76fb4b": {
"describe": {
"columns": [],
Expand Down Expand Up @@ -6814,56 +6838,6 @@
},
"query": "\nselect exists(select 1 from user_image_library where user_id = $1 and id = $2) as \"exists!\"\n "
},
"623f17401360608227b31698dad2ece2b30355867df2ae6bbf9b4a92703fda25": {
"describe": {
"columns": [
{
"name": "plan_type?: PlanType",
"ordinal": 0,
"type_info": "Int2"
},
{
"name": "subscription_status?: SubscriptionStatus",
"ordinal": 1,
"type_info": "Int2"
},
{
"name": "is_admin!",
"ordinal": 2,
"type_info": "Bool"
},
{
"name": "verified!",
"ordinal": 3,
"type_info": "Bool"
},
{
"name": "school_id?: SchoolId",
"ordinal": 4,
"type_info": "Uuid"
},
{
"name": "overdue!",
"ordinal": 5,
"type_info": "Bool"
}
],
"nullable": [
false,
false,
false,
false,
false,
null
],
"parameters": {
"Left": [
"Uuid"
]
}
},
"query": "\nselect\n subscription_plan.plan_type as \"plan_type?: PlanType\",\n subscription.status as \"subscription_status?: SubscriptionStatus\",\n user_account.admin as \"is_admin!\",\n user_account.verified as \"verified!\",\n school.school_id as \"school_id?: SchoolId\",\n case\n when subscription.amount_due > 0 then true\n else false\n end as \"overdue!\"\nfrom user_account\ninner join account using (account_id)\nleft join school using (account_id)\nleft join (\n select subscription.account_id, status, amount_due, subscription_plan_id\n from subscription\n join (\n select\n distinct on (account_id)\n account_id, subscription_id\n from subscription\n order by account_id, created_at desc\n ) as recent_subscription using (subscription_id)\n) as subscription using (account_id)\nleft join subscription_plan on subscription.subscription_plan_id = subscription_plan.plan_id\nwhere user_account.user_id = $1\n"
},
"62d96e4b30f7828cbc7255b3be93f16aa1a868bd5a9780ae80079dbbfe858694": {
"describe": {
"columns": [
Expand Down Expand Up @@ -9986,6 +9960,19 @@
},
"query": "\ninsert into course_data_category(course_data_id, category_id)\nselect $2, category_id\nfrom course_data_category\nwhere course_data_id = $1\n "
},
"96459ff3ea8e971231813b94ba45414bf7de30ef206dc9c12244774ab809332f": {
"describe": {
"columns": [],
"nullable": [],
"parameters": {
"Left": [
"Uuid",
"Uuid"
]
}
},
"query": "update school set internal_school_name_id = $2 where school_id = $1"
},
"96569e9389d5fa1a63e58cd3f1b618d0edd302dab9da28604bd88276d2e344c1": {
"describe": {
"columns": [
Expand Down Expand Up @@ -10383,30 +10370,6 @@
},
"query": "\nselect exists (\n select 1\n from jig_like\n where\n jig_id = $1\n and user_id = $2\n) as \"exists!\"\n "
},
"9dc33431675342494dd797271a1544a4128a8eb6b4a142de5f533b326811743d": {
"describe": {
"columns": [
{
"name": "id!: SchoolNameId",
"ordinal": 0,
"type_info": "Uuid"
},
{
"name": "name!",
"ordinal": 1,
"type_info": "Text"
}
],
"nullable": [
false,
null
],
"parameters": {
"Left": []
}
},
"query": "\nselect\n school_name_id as \"id!: SchoolNameId\",\n name::text as \"name!\"\nfrom school_name\n"
},
"9e0df70165968be7b982a6f1964daab57e2d65d634115cabe4187f3d6f386a9f": {
"describe": {
"columns": [
Expand Down Expand Up @@ -11825,6 +11788,62 @@
},
"query": "\n update user_asset_data\n set playlist_count = playlist_count + 1,\n total_asset_count = total_asset_count + 1\n from playlist\n where author_id = user_id and\n published_at is null and\n id = $1"
},
"b120a6c2b6055b96a909895d534f7a68e64c5e085e658eee06bb60739485be7a": {
"describe": {
"columns": [
{
"name": "plan_type?: PlanType",
"ordinal": 0,
"type_info": "Int2"
},
{
"name": "subscription_status?: SubscriptionStatus",
"ordinal": 1,
"type_info": "Int2"
},
{
"name": "is_admin!",
"ordinal": 2,
"type_info": "Bool"
},
{
"name": "verified!",
"ordinal": 3,
"type_info": "Bool"
},
{
"name": "school_id?: SchoolId",
"ordinal": 4,
"type_info": "Uuid"
},
{
"name": "school_name?",
"ordinal": 5,
"type_info": "Text"
},
{
"name": "overdue!",
"ordinal": 6,
"type_info": "Bool"
}
],
"nullable": [
false,
false,
false,
false,
false,
null,
null
],
"parameters": {
"Left": [
"Uuid"
]
}
},
"query": "\nselect\n subscription_plan.plan_type as \"plan_type?: PlanType\",\n subscription.status as \"subscription_status?: SubscriptionStatus\",\n user_account.admin as \"is_admin!\",\n user_account.verified as \"verified!\",\n school.school_id as \"school_id?: SchoolId\",\n school.school_name::text as \"school_name?\",\n case\n when subscription.amount_due > 0 then true\n else false\n end as \"overdue!\"\nfrom user_account\ninner join account using (account_id)\nleft join school using (account_id)\nleft join (\n select subscription.account_id, status, amount_due, subscription_plan_id\n from subscription\n join (\n select\n distinct on (account_id)\n account_id, subscription_id\n from subscription\n order by account_id, created_at desc\n ) as recent_subscription using (subscription_id)\n) as subscription using (account_id)\nleft join subscription_plan on subscription.subscription_plan_id = subscription_plan.plan_id\nwhere user_account.user_id = $1\n"
},
"b1513ce8a836f80987c480701be8ab9dbc124d8a4556503a4ad2dc77b1ae50d2": {
"describe": {
"columns": [
Expand Down
28 changes: 25 additions & 3 deletions backend/api/src/db/account.rs
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,7 @@ select
user_account.admin as "is_admin!",
user_account.verified as "verified!",
school.school_id as "school_id?: SchoolId",
school.school_name::text as "school_name?",
case
when subscription.amount_due > 0 then true
else false
Expand Down Expand Up @@ -690,15 +691,18 @@ where school_name_id = $1
.await
}

pub async fn get_school_names(pool: &PgPool) -> sqlx::Result<Vec<SchoolName>> {
pub async fn get_unused_school_names(pool: &PgPool) -> sqlx::Result<Vec<SchoolName>> {
sqlx::query_as!(
SchoolName,
// language=SQL
r#"
select
school_name_id as "id!: SchoolNameId",
name::text as "name!"
school_name.school_name_id as "id!: SchoolNameId",
school_name.name::text as "name!"
from school_name
left join school on school_name.school_name_id = school.internal_school_name_id
where
school.school_id is null
"#,
)
.fetch_all(pool)
Expand Down Expand Up @@ -818,6 +822,24 @@ pub async fn verify_school(pool: &PgPool, school_id: SchoolId, verified: bool) -
Ok(())
}

#[instrument(skip(pool))]
pub async fn set_internal_school_name(
pool: &PgPool,
school_id: SchoolId,
school_name_id: SchoolNameId,
) -> sqlx::Result<()> {
sqlx::query!(
// language=SQL
r#"update school set internal_school_name_id = $2 where school_id = $1"#,
school_id as SchoolId,
school_name_id as SchoolNameId,
)
.execute(pool)
.await?;

Ok(())
}

#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub enum AccountMember {
Admin,
Expand Down
37 changes: 2 additions & 35 deletions backend/api/src/http/endpoints/account.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@ use ji_core::settings::RuntimeSettings;
use shared::api::endpoints::account::{
DeleteSchoolAccount, GetIndividualAccount, GetSchoolAccount, UpdateSchoolAccount,
};
use shared::api::endpoints::admin::{GetAdminSchoolAccount, UpdateSchoolName};
use shared::api::endpoints::admin::GetAdminSchoolAccount;
use shared::api::{endpoints::account::CreateSchoolAccount, ApiEndpoint, PathParts};
use shared::domain::admin::GetAdminSchoolAccountResponse;
use shared::domain::billing::{
AccountIfAuthorized, CreateSchoolAccountRequest, GetSchoolAccountResponse,
IndividualAccountResponse, SchoolId, SchoolNameId, SchoolNameValue, UpdateSchoolAccountRequest,
IndividualAccountResponse, SchoolId, UpdateSchoolAccountRequest,
};
use shared::domain::UpdateNonNullable;
use shared::error::{AccountError, IntoAnyhow};
Expand Down Expand Up @@ -111,35 +111,6 @@ async fn update_school_account(
Ok(HttpResponse::Ok().finish())
}

#[instrument(skip_all)]
async fn update_school_name(
_auth: TokenUserWithScope<ScopeAdmin>,
db: Data<PgPool>,
path: Path<SchoolNameId>,
req: Json<<UpdateSchoolName as ApiEndpoint>::Req>,
) -> Result<HttpResponse, <UpdateSchoolName as ApiEndpoint>::Err> {
let school_name_id = path.into_inner();

let new_name: SchoolNameValue = req.into_inner();

if db::account::check_renamed_school_name_exists(
db.as_ref(),
new_name.as_ref(),
&school_name_id,
)
.await
.into_anyhow()?
{
return Err(AccountError::SchoolNameExists(new_name));
}

db::account::update_school_name(db.as_ref(), &school_name_id, new_name)
.await
.into_anyhow()?;

Ok(HttpResponse::Ok().finish())
}

async fn get_school_account(
auth: TokenUser,
db: Data<PgPool>,
Expand Down Expand Up @@ -314,10 +285,6 @@ pub fn configure(cfg: &mut ServiceConfig) {
.route()
.to(update_school_account),
)
.route(
<UpdateSchoolName as ApiEndpoint>::Path::PATH,
UpdateSchoolName::METHOD.route().to(update_school_name),
)
.route(
<DeleteSchoolAccount as ApiEndpoint>::Path::PATH,
DeleteSchoolAccount::METHOD
Expand Down
Loading

0 comments on commit a9c2609

Please sign in to comment.