Skip to content
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions graphql/schema.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -1315,6 +1315,10 @@ type Mutation {
upsertPage(page: NewPageInput!): String!
updateMenu(menu: MenuUpdate!): Menu!
validateTurnstileToken(token: String!): Boolean!
"""
Adds a new subject heading to the global list.
"""
createSubjectHeading(name: String!, status: ApprovalStatus!): SubjectHeading!
}

"""
Expand Down Expand Up @@ -1528,6 +1532,10 @@ type Query {
listUsers: [User!]!
abbreviationIdFromShortName(shortName: String!): UUID!
menuBySlug(slug: String!): Menu!
"""
Fetch all available subject headings.
"""
allSubjectHeadings: [SubjectHeading!]!
}

"""
Expand Down
41 changes: 36 additions & 5 deletions graphql/src/query.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,12 @@ use dailp::{
page::{NewPageInput, Page},
slugify_ltree,
user::{User, UserUpdate},
AnnotatedForm, AnnotatedSeg, AttachAudioToDocumentInput, AttachAudioToWordInput,
CollectionChapter, Contributor, ContributorRole, CreateEditedCollectionInput,
CurateDocumentAudioInput, CurateWordAudioInput, Date, DeleteContributorAttribution,
DocumentMetadata, DocumentMetadataUpdate, DocumentParagraph, PositionInDocument,
SourceAttribution, TranslatedPage, TranslatedSection, UpdateContributorAttribution, Uuid,
AnnotatedForm, AnnotatedSeg, ApprovalStatus, AttachAudioToDocumentInput,
AttachAudioToWordInput, CollectionChapter, Contributor, ContributorRole,
CreateEditedCollectionInput, CurateDocumentAudioInput, CurateWordAudioInput, Date,
DeleteContributorAttribution, DocumentMetadata, DocumentMetadataUpdate, DocumentParagraph,
PositionInDocument, SourceAttribution, SubjectHeading, TranslatedPage, TranslatedSection,
UpdateContributorAttribution, Uuid,
};
use itertools::{Itertools, Position};
use log::{debug, info};
Expand Down Expand Up @@ -408,6 +409,16 @@ impl Query {
.get_menu_by_slug(slug)
.await?)
}

/// Fetch all available subject headings.
async fn all_subject_headings(
&self,
context: &Context<'_>,
) -> FieldResult<Vec<SubjectHeading>> {
let db = context.data::<DataLoader<Database>>()?.loader();

Ok(db.get_all_subject_headings().await?)
}
}

pub struct Mutation;
Expand Down Expand Up @@ -1001,6 +1012,26 @@ impl Mutation {

Ok(body_json["success"].as_bool().unwrap())
}

/// Adds a new subject heading to the global list.
async fn create_subject_heading(
&self,
context: &Context<'_>,
name: String,
status: ApprovalStatus,
) -> FieldResult<SubjectHeading> {
let db = context.data::<DataLoader<Database>>()?.loader();

let new_heading = SubjectHeading {
id: Uuid::new_v4(),
name,
status,
};

db.insert_subject_heading(&new_heading).await?;

Ok(new_heading)
}
}

#[derive(async_graphql::SimpleObject)]
Expand Down
6 changes: 6 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

30 changes: 30 additions & 0 deletions types/src/database_sql.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2713,6 +2713,36 @@ impl Database {
.await?;
Ok(())
}

pub async fn get_all_subject_headings(&self) -> Result<Vec<SubjectHeading>> {
let results = sqlx::query_as::<_, SubjectHeading>(
r#"
SELECT id, name, status
FROM subject_heading
ORDER BY name ASC
"#,
)
.fetch_all(&self.client)
.await?;

Ok(results)
}

pub async fn insert_subject_heading(&self, heading: &SubjectHeading) -> Result<()> {
sqlx::query(
r#"
INSERT INTO subject_heading (id, name, status)
VALUES ($1, $2, $3)
"#,
)
.bind(heading.id)
.bind(&heading.name)
.bind(heading.status)
.execute(&self.client)
.await?;

Ok(())
}
}

#[async_trait]
Expand Down
67 changes: 67 additions & 0 deletions website/src/graphql/dailp/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -931,6 +931,8 @@ export type Mutation = {
*/
readonly attachAudioToWord: AnnotatedForm
readonly createEditedCollection: Scalars["String"]
/** Adds a new subject heading to the global list. */
readonly createSubjectHeading: SubjectHeading
/** Decide if a piece of document audio should be included in edited collection */
readonly curateDocumentAudio: AnnotatedDoc
/** Decide if a piece of word audio should be included in edited collection */
Expand Down Expand Up @@ -984,6 +986,11 @@ export type MutationCreateEditedCollectionArgs = {
input: CreateEditedCollectionInput
}

export type MutationCreateSubjectHeadingArgs = {
name: Scalars["String"]
status: ApprovalStatus
}

export type MutationCurateDocumentAudioArgs = {
input: CurateDocumentAudioInput
}
Expand Down Expand Up @@ -1153,6 +1160,8 @@ export type Query = {
readonly allEditedCollections: ReadonlyArray<EditedCollection>
/** List of all content pages */
readonly allPages: ReadonlyArray<Page>
/** Fetch all available subject headings. */
readonly allSubjectHeadings: ReadonlyArray<SubjectHeading>
/** List of all the functional morpheme tags available */
readonly allTags: ReadonlyArray<MorphemeTag>
/** Retrieves all documents that are bookmarked by the current user. */
Expand Down Expand Up @@ -1941,6 +1950,30 @@ export type DocFormFieldsFragment = {
>
}

export type AllSubjectHeadingsQueryVariables = Exact<{ [key: string]: never }>

export type AllSubjectHeadingsQuery = { readonly __typename?: "Query" } & {
readonly allSubjectHeadings: ReadonlyArray<
{ readonly __typename?: "SubjectHeading" } & Pick<
SubjectHeading,
"id" | "name" | "status"
>
>
}

export type CreateSubjectHeadingMutationVariables = Exact<{
name: Scalars["String"]
status: ApprovalStatus
}>

export type CreateSubjectHeadingMutation = {
readonly __typename?: "Mutation"
} & {
readonly createSubjectHeading: {
readonly __typename?: "SubjectHeading"
} & Pick<SubjectHeading, "id" | "name" | "status">
}

export type ParagraphFormFieldsFragment = {
readonly __typename: "DocumentParagraph"
} & Pick<DocumentParagraph, "id" | "index" | "translation"> & {
Expand Down Expand Up @@ -3787,6 +3820,40 @@ export function useDocumentContentsQuery(
...options,
})
}
export const AllSubjectHeadingsDocument = gql`
query AllSubjectHeadings {
allSubjectHeadings {
id
name
status
}
}
`

export function useAllSubjectHeadingsQuery(
options?: Omit<Urql.UseQueryArgs<AllSubjectHeadingsQueryVariables>, "query">
) {
return Urql.useQuery<
AllSubjectHeadingsQuery,
AllSubjectHeadingsQueryVariables
>({ query: AllSubjectHeadingsDocument, ...options })
}
export const CreateSubjectHeadingDocument = gql`
mutation CreateSubjectHeading($name: String!, $status: ApprovalStatus!) {
createSubjectHeading(name: $name, status: $status) {
id
name
status
}
}
`

export function useCreateSubjectHeadingMutation() {
return Urql.useMutation<
CreateSubjectHeadingMutation,
CreateSubjectHeadingMutationVariables
>(CreateSubjectHeadingDocument)
}
export const CollectionDocument = gql`
query Collection($slug: String!) {
collection(slug: $slug) {
Expand Down
15 changes: 15 additions & 0 deletions website/src/graphql/dailp/queries.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,21 @@ fragment DocFormFields on AnnotatedDoc {
}
}

query AllSubjectHeadings {
allSubjectHeadings {
id
name
status
}
}

mutation CreateSubjectHeading($name: String!, $status: ApprovalStatus!) {
createSubjectHeading(name: $name, status: $status) {
id
name
status
}
}
fragment ParagraphFormFields on DocumentParagraph {
__typename
id
Expand Down
Loading
Loading