Skip to content

Added mutations for action Item Category #3432

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Show file tree
Hide file tree
Changes from 4 commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
996dc79
Added mutations for action Item Category
NishantSinghhhhh Apr 6, 2025
5c86d3b
Merge branch 'develop-postgres' into ActionItemCategory
NishantSinghhhhh Apr 7, 2025
75d910e
Added tests
NishantSinghhhhh Apr 7, 2025
04eba4f
Added test for createAction Item Category
NishantSinghhhhh Apr 9, 2025
0bb9e11
rabbits changes
NishantSinghhhhh Apr 9, 2025
c123acb
rabbits changes
NishantSinghhhhh Apr 9, 2025
0a07f4f
rabbits changes
NishantSinghhhhh Apr 9, 2025
5858194
rabbits changes
NishantSinghhhhh Apr 9, 2025
3645672
Merge branch 'develop-postgres' into ActionItemCategory
NishantSinghhhhh Apr 10, 2025
3372bd2
Created an input type for createActionItem
NishantSinghhhhh Apr 10, 2025
f689e29
Created an input type for createActionItem
NishantSinghhhhh Apr 10, 2025
cc2e986
Created an input type for createActionItem
NishantSinghhhhh Apr 10, 2025
9e3bb02
Created an input type for createActionItem
NishantSinghhhhh Apr 10, 2025
b03f5c2
Added types for 2 mutations and edited 1 mutation named createActionI…
NishantSinghhhhh Apr 10, 2025
040fef1
Merge branch 'develop-postgres' into ActionItemCategory
NishantSinghhhhh Apr 12, 2025
0143f00
changed files
NishantSinghhhhh Apr 14, 2025
ce056bc
Addedd changes
NishantSinghhhhh Apr 16, 2025
4889eeb
Merge branch 'ActionItemCategory' of https://github.com/NishantSinghh…
NishantSinghhhhh Apr 16, 2025
255c319
Added changes
NishantSinghhhhh Apr 18, 2025
6e3ce55
Added changes
NishantSinghhhhh Apr 18, 2025
8ffa4f0
Added changes
NishantSinghhhhh Apr 18, 2025
5ce99b4
Added changes
NishantSinghhhhh Apr 18, 2025
0ac4781
Added changes
NishantSinghhhhh Apr 18, 2025
4efeea4
Added changes
NishantSinghhhhh Apr 18, 2025
66de1bd
Added changes
NishantSinghhhhh Apr 18, 2025
e736e0a
Added changes
NishantSinghhhhh Apr 18, 2025
a2d07f1
Added changes
NishantSinghhhhh Apr 18, 2025
eaa3b9f
Added tests
NishantSinghhhhh Apr 18, 2025
56b290c
Added tests
NishantSinghhhhh Apr 18, 2025
00646cd
Added tests
NishantSinghhhhh Apr 18, 2025
b6d8ade
Added tests
NishantSinghhhhh Apr 18, 2025
335a92d
Added tests
NishantSinghhhhh Apr 18, 2025
1f96ef2
Added tests
NishantSinghhhhh Apr 18, 2025
95fdf64
Merge branch 'develop-postgres' into ActionItemCategory
NishantSinghhhhh Apr 18, 2025
267bb0c
Added tests
NishantSinghhhhh Apr 18, 2025
86c83e4
Added tests
NishantSinghhhhh Apr 18, 2025
6127a9a
Added tests
NishantSinghhhhh Apr 18, 2025
31b85f0
Added tests
NishantSinghhhhh Apr 18, 2025
8d5649d
Added tests
NishantSinghhhhh Apr 18, 2025
43ce3ff
Added tests
NishantSinghhhhh Apr 18, 2025
0b7b030
Added tests
NishantSinghhhhh Apr 18, 2025
a473043
Added alloted hours
NishantSinghhhhh Apr 21, 2025
b918f6d
Added changes
NishantSinghhhhh Apr 21, 2025
42610e6
Merge branch 'develop-postgres' into ActionItemCategory
NishantSinghhhhh Apr 21, 2025
9f8d528
Added changes
NishantSinghhhhh Apr 22, 2025
8fb5aa8
'Merge branch 'ActionItemCategory' of https://github.com/NishantSingh…
NishantSinghhhhh Apr 22, 2025
f1b412c
removed type errors
NishantSinghhhhh Apr 22, 2025
0eb60de
removed type errors
NishantSinghhhhh Apr 22, 2025
d8a85ca
removed type errors
NishantSinghhhhh Apr 22, 2025
fa3373a
changed names of tables
NishantSinghhhhh Apr 22, 2025
24804c3
Added alloted hours data in sample data for actionItems
NishantSinghhhhh Apr 22, 2025
c5a75eb
Added alloted hours data in sample data for actionItems
NishantSinghhhhh Apr 22, 2025
280ed54
Added alloted hours data in sample data for actionItems
NishantSinghhhhh Apr 22, 2025
a0ea106
Added changes in table
NishantSinghhhhh Apr 22, 2025
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
30 changes: 24 additions & 6 deletions schema.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -511,6 +511,12 @@ type Community {
youtubeURL: String
}

input CreateActionItemCategoryInput {
isDisabled: Boolean
name: String!
organizationId: ID!
}

input CreateActionItemInput {
assignedAt: String
assigneeId: ID!
Expand Down Expand Up @@ -773,6 +779,11 @@ type GetUrlResponse {
presignedUrl: String
}

type HasUserVoted {
"""Type of the post vote"""
type: PostVoteType!
}

"""
Possible variants of the two-letter language code defined in ISO 639-1, part of the ISO 639 standard published by the International Organization for Standardization (ISO), to represent natural languages.
"""
Expand Down Expand Up @@ -1472,6 +1483,9 @@ type Mutation {
"""Mutation field to create an action item."""
createActionItem(input: CreateActionItemInput!): ActionItem

"""Mutation field to create a new Action Item Category."""
createActionItemCategory(input: CreateActionItemCategoryInput!): ActionItemCategory

"""Mutation field to create an advertisement."""
createAdvertisement(input: MutationCreateAdvertisementInput!): Advertisement

Expand Down Expand Up @@ -1646,6 +1660,9 @@ type Mutation {
input: MutationUpdateActionItemInput!
): ActionItem

"""Mutation field to update an existing Action Item Category."""
updateActionItemCategory(input: UpdateActionItemCategoryInput!): ActionItemCategory

"""Mutation field to update an advertisement."""
updateAdvertisement(input: MutationUpdateAdvertisementInput!): Advertisement

Expand Down Expand Up @@ -3360,7 +3377,7 @@ type Query {
fundCampaignPledge(input: QueryFundCampaignPledgeInput!): FundCampaignPledge

"""Query field to read a post vote."""
hasUserVoted(input: QueryHasUserVotedInput!): hasUserVoted
hasUserVoted(input: QueryHasUserVotedInput!): HasUserVoted

"""Query field to read an organization."""
organization(input: QueryOrganizationInput!): Organization
Expand Down Expand Up @@ -3666,6 +3683,12 @@ type TagFolderTagsConnectionEdge {
node: Tag
}

input UpdateActionItemCategoryInput {
categoryId: ID!
isDisabled: Boolean
name: String
}

"""The `Upload` scalar type represents a file upload."""
scalar Upload

Expand Down Expand Up @@ -3894,9 +3917,4 @@ type VenueEventsConnection {
type VenueEventsConnectionEdge {
cursor: String!
node: Event
}

type hasUserVoted {
"""Type of the post vote"""
type: PostVoteType!
}
5 changes: 0 additions & 5 deletions src/createServer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -82,11 +82,6 @@ export const createServer = async (options?: {
closeClient: true,
});

// fastify.register(fastifyRedis, {
// url: fastify.envConfig.API_REDIS_URI,
// closeClient: true,
// });

// More information at this link: https://github.com/fastify/fastify-jwt
fastify.register(fastifyJwt, {
secret: fastify.envConfig.API_JWT_SECRET,
Expand Down
4 changes: 0 additions & 4 deletions src/envConfigSchema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -240,10 +240,6 @@ export const envConfigSchema = Type.Object({
maximum: 65535,
minimum: 0,
}),
// API_REDIS_URI: Type.String({
// format: "uri",
// pattern: "^redis://.*",
// }),

API_GRAPHQL_SCALAR_FIELD_COST: Type.Number({
minimum: 0,
Expand Down
254 changes: 128 additions & 126 deletions src/graphql/types/Mutation/createActionItem.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,145 +17,147 @@ const mutationCreateActionItemArgumentsSchema = z.object({
}),
});

builder.mutationField("createActionItem", (t) =>
t.field({
type: ActionItem,
args: {
input: t.arg({
required: true,
type: builder.inputType("CreateActionItemInput", {
fields: (t) => ({
categoryId: t.field({ type: "ID", required: true }),
assigneeId: t.field({ type: "ID", required: true }),
preCompletionNotes: t.field({ type: "String" }),
eventId: t.field({ type: "ID" }),
organizationId: t.field({ type: "ID", required: true }),
assignedAt: t.field({ type: "String" }), // 🆕 Added assignedAt field
export const createActionItemMutation = builder.mutationField(
"createActionItem",
(t) =>
t.field({
type: ActionItem,
args: {
input: t.arg({
required: true,
type: builder.inputType("CreateActionItemInput", {
fields: (t) => ({
categoryId: t.field({ type: "ID", required: true }),
assigneeId: t.field({ type: "ID", required: true }),
preCompletionNotes: t.field({ type: "String" }),
eventId: t.field({ type: "ID" }),
organizationId: t.field({ type: "ID", required: true }),
assignedAt: t.field({ type: "String" }), // 🆕 Added assignedAt field
}),
}),
}),
}),
},
description: "Mutation field to create an action item.",
resolve: async (_parent, args, ctx) => {
if (!ctx.currentClient.isAuthenticated) {
throw new TalawaGraphQLError({
extensions: { code: "unauthenticated" },
});
}
},
description: "Mutation field to create an action item.",
resolve: async (_parent, args, ctx) => {
if (!ctx.currentClient.isAuthenticated) {
throw new TalawaGraphQLError({
extensions: { code: "unauthenticated" },
});
}

const parsedArgs = mutationCreateActionItemArgumentsSchema.parse(args);
const currentUserId = ctx.currentClient.user.id;
const parsedArgs = mutationCreateActionItemArgumentsSchema.parse(args);
const currentUserId = ctx.currentClient.user.id;

// **1. Check if the organization exists**
const existingOrganization =
await ctx.drizzleClient.query.organizationsTable.findFirst({
columns: { id: true },
where: (fields, operators) =>
operators.eq(fields.id, parsedArgs.input.organizationId),
});
// **1. Check if the organization exists**
const existingOrganization =
await ctx.drizzleClient.query.organizationsTable.findFirst({
columns: { id: true },
where: (fields, operators) =>
operators.eq(fields.id, parsedArgs.input.organizationId),
});

if (!existingOrganization) {
throw new TalawaGraphQLError({
extensions: {
code: "arguments_associated_resources_not_found",
issues: [{ argumentPath: ["input", "organizationId"] }],
},
});
}
if (!existingOrganization) {
throw new TalawaGraphQLError({
extensions: {
code: "arguments_associated_resources_not_found",
issues: [{ argumentPath: ["input", "organizationId"] }],
},
});
}

// **2. Check if the user is part of the organization**
const userMembership =
await ctx.drizzleClient.query.organizationMembershipsTable.findFirst({
columns: { role: true },
where: (fields, operators) =>
sql`${operators.eq(fields.memberId, currentUserId)} AND ${operators.eq(fields.organizationId, parsedArgs.input.organizationId)}`,
});
// **2. Check if the user is part of the organization**
const userMembership =
await ctx.drizzleClient.query.organizationMembershipsTable.findFirst({
columns: { role: true },
where: (fields, operators) =>
sql`${operators.eq(fields.memberId, currentUserId)} AND ${operators.eq(fields.organizationId, parsedArgs.input.organizationId)}`,
});

if (!userMembership) {
throw new TalawaGraphQLError({
extensions: {
code: "unauthorized_action_on_arguments_associated_resources",
issues: [{ argumentPath: ["input", "organizationId"] }],
},
});
}
if (!userMembership) {
throw new TalawaGraphQLError({
extensions: {
code: "unauthorized_action_on_arguments_associated_resources",
issues: [{ argumentPath: ["input", "organizationId"] }],
},
});
}

const existingCategory =
await ctx.drizzleClient.query.actionCategoriesTable.findFirst({
columns: { id: true },
where: (fields, operators) =>
operators.eq(fields.id, parsedArgs.input.categoryId),
});
const existingCategory =
await ctx.drizzleClient.query.actionCategoriesTable.findFirst({
columns: { id: true },
where: (fields, operators) =>
operators.eq(fields.id, parsedArgs.input.categoryId),
});

if (!existingCategory) {
throw new TalawaGraphQLError({
extensions: {
code: "arguments_associated_resources_not_found",
issues: [{ argumentPath: ["input", "categoryId"] }],
},
});
}
if (!existingCategory) {
throw new TalawaGraphQLError({
extensions: {
code: "arguments_associated_resources_not_found",
issues: [{ argumentPath: ["input", "categoryId"] }],
},
});
}

const existingAssignee =
await ctx.drizzleClient.query.usersTable.findFirst({
columns: { id: true },
where: (fields, operators) =>
operators.eq(fields.id, parsedArgs.input.assigneeId),
});
const existingAssignee =
await ctx.drizzleClient.query.usersTable.findFirst({
columns: { id: true },
where: (fields, operators) =>
operators.eq(fields.id, parsedArgs.input.assigneeId),
});

if (!existingAssignee) {
throw new TalawaGraphQLError({
extensions: {
code: "arguments_associated_resources_not_found",
issues: [{ argumentPath: ["input", "assigneeId"] }],
},
});
}
if (!existingAssignee) {
throw new TalawaGraphQLError({
extensions: {
code: "arguments_associated_resources_not_found",
issues: [{ argumentPath: ["input", "assigneeId"] }],
},
});
}

if (userMembership.role !== "administrator") {
throw new TalawaGraphQLError({
extensions: {
code: "forbidden_action_on_arguments_associated_resources",
issues: [
{
argumentPath: ["input", "organizationId"],
message:
"Only administrators can create action items for this organization.",
},
],
},
});
}
if (userMembership.role !== "administrator") {
throw new TalawaGraphQLError({
extensions: {
code: "forbidden_action_on_arguments_associated_resources",
issues: [
{
argumentPath: ["input", "organizationId"],
message:
"Only administrators can create action items for this organization.",
},
],
},
});
}

const [createdActionItem] = await ctx.drizzleClient
.insert(actionsTable)
.values({
id: uuidv7(),
creatorId: currentUserId,
categoryId: parsedArgs.input.categoryId,
assigneeId: parsedArgs.input.assigneeId,
assignedAt: parsedArgs.input.assignedAt // 🆕 Using provided assignedAt date
? new Date(parsedArgs.input.assignedAt)
: new Date(), // Default to current date if not provided
completionAt: new Date(),
preCompletionNotes: parsedArgs.input.preCompletionNotes ?? null,
postCompletionNotes: null,
isCompleted: false,
eventId: parsedArgs.input.eventId ?? null,
organizationId: parsedArgs.input.organizationId,
updatedAt: new Date(),
updaterId: currentUserId,
})
.returning();
const [createdActionItem] = await ctx.drizzleClient
.insert(actionsTable)
.values({
id: uuidv7(),
creatorId: currentUserId,
categoryId: parsedArgs.input.categoryId,
assigneeId: parsedArgs.input.assigneeId,
assignedAt: parsedArgs.input.assignedAt // 🆕 Using provided assignedAt date
? new Date(parsedArgs.input.assignedAt)
: new Date(), // Default to current date if not provided
completionAt: new Date(),
preCompletionNotes: parsedArgs.input.preCompletionNotes ?? null,
postCompletionNotes: null,
isCompleted: false,
eventId: parsedArgs.input.eventId ?? null,
organizationId: parsedArgs.input.organizationId,
updatedAt: new Date(),
updaterId: currentUserId,
})
.returning();

if (!createdActionItem) {
ctx.log.error(
"Postgres insert operation unexpectedly returned an empty array.",
);
throw new TalawaGraphQLError({ extensions: { code: "unexpected" } });
}
if (!createdActionItem) {
ctx.log.error(
"Postgres insert operation unexpectedly returned an empty array.",
);
throw new TalawaGraphQLError({ extensions: { code: "unexpected" } });
}

return createdActionItem;
},
}),
return createdActionItem;
},
}),
);
Loading
Loading