Skip to content
Open
Show file tree
Hide file tree
Changes from all 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 @@ -1004,6 +1015,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