Skip to content

Commit

Permalink
refactor: optimize voting API endpoints
Browse files Browse the repository at this point in the history
  • Loading branch information
garyellow committed May 13, 2024
1 parent 059a516 commit 26132ff
Show file tree
Hide file tree
Showing 7 changed files with 99 additions and 147 deletions.
46 changes: 19 additions & 27 deletions server/api/voting/add.post.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,23 @@
import prisma from '~/lib/prisma'
import { getServerSession } from '#auth'
export default defineEventHandler(async (event) => {
// 確認權限
if (!event.context.session) {
throw createError({
statusCode: 401,
statusMessage: 'Unauthorized',
message: '未登入',
})
}

if (!event.context.isAdmin) {
throw createError({
statusCode: 403,
statusMessage: 'Forbidden',
message: '不是管理員',
})
}

// 確認參數
const { voteName, voteGroup, startTime, endTime, onlyOne, candidates } = await readBody(event) as {
voteName: string
voteGroup: number | undefined
Expand Down Expand Up @@ -36,32 +53,7 @@ export default defineEventHandler(async (event) => {
})
}

const session = await getServerSession(event) as { user: { email: string } } | null

if (!session) {
throw createError({
statusCode: 401,
statusMessage: 'Unauthorized',
message: '未登入',
})
}

const email = session.user.email
const studentId = parseInt(email.substring(1, 10))

const admin = await prisma.admin.findUnique({
where: { id: studentId },
select: null,
})

if (!admin) {
throw createError({
statusCode: 403,
statusMessage: 'Forbidden',
message: '不在管理員名單中',
})
}

// 執行操作
const voting = await prisma.voting.create({
data: {
name: voteName,
Expand Down
41 changes: 16 additions & 25 deletions server/api/voting/archive.post.ts
Original file line number Diff line number Diff line change
@@ -1,39 +1,30 @@
import prisma from '~/lib/prisma'
import { getServerSession } from '#auth'
export default defineEventHandler(async (event) => {
const { id } = await readBody(event) as { id: string | undefined }

if (!id || isNaN(parseInt(id))) {
throw createError({
statusCode: 400,
statusMessage: 'Bad Request',
message: 'Parameter "id" is required and should be a number.',
})
}

const session = await getServerSession(event) as { user: { email: string } } | null

if (!session) {
// 確認權限
if (!event.context.session) {
throw createError({
statusCode: 401,
statusMessage: 'Unauthorized',
message: '未登入',
})
}

const email = session.user.email
const studentId = email.substring(1, 10)

const admin = await prisma.admin.findUnique({
where: { id: parseInt(studentId) },
select: null,
})

if (!admin) {
if (!event.context.isAdmin) {
throw createError({
statusCode: 403,
statusMessage: 'Forbidden',
message: '不在管理員名單中',
message: '不是管理員',
})
}

// 確認參數
const { id } = await readBody(event) as { id: string | undefined }

if (!id || isNaN(parseInt(id))) {
throw createError({
statusCode: 400,
statusMessage: 'Bad Request',
message: 'Parameter "id" is required and should be a number.',
})
}

Expand All @@ -44,7 +35,7 @@ export default defineEventHandler(async (event) => {
},
})

if (studentId != process.env.SUPER_ADMIN) {
if (!event.context.isSuperAdmin) {
if (Date.now() >= voting.startTime.getTime()) {
throw createError({
statusCode: 403,
Expand Down
35 changes: 16 additions & 19 deletions server/api/voting/del.delete.ts
Original file line number Diff line number Diff line change
@@ -1,37 +1,34 @@
import prisma from '~/lib/prisma'
import { getServerSession } from '#auth'
export default defineEventHandler(async (event) => {
const { id } = getQuery(event) as { id: string | undefined }

if (!id || isNaN(parseInt(id))) {
throw createError({
statusCode: 400,
statusMessage: 'Bad Request',
message: 'Parameter "id" is required and should be a number.',
})
}

const session = await getServerSession(event) as { user: { email: string } } | null

if (!session) {
// 確認權限
if (!event.context.session) {
throw createError({
statusCode: 401,
statusMessage: 'Unauthorized',
message: '未登入',
})
}

const email = session.user.email
const studentId = email.substring(1, 10)

if (studentId != process.env.SUPER_ADMIN) {
if (!event.context.isAdmin) {
throw createError({
statusCode: 403,
statusMessage: 'Forbidden',
message: '不是超級管理員',
message: '不是管理員',
})
}

// 確認參數
const { id } = getQuery(event) as { id: string | undefined }

if (!id || isNaN(parseInt(id))) {
throw createError({
statusCode: 400,
statusMessage: 'Bad Request',
message: 'Parameter "id" is required and should be a number.',
})
}

// 執行操作
const voting = await prisma.voting.findUniqueOrThrow({
where: { id: parseInt(id) },
select: { archive: true },
Expand Down
19 changes: 5 additions & 14 deletions server/api/voting/getAll.get.ts
Original file line number Diff line number Diff line change
@@ -1,32 +1,23 @@
import prisma from '~/lib/prisma'
import { getServerSession } from '#auth'
export default defineEventHandler(async (event) => {
const session = await getServerSession(event) as { user: { email: string } } | null

if (!session) {
// 確認權限
if (!event.context.session) {
throw createError({
statusCode: 401,
statusMessage: 'Unauthorized',
message: '未登入',
})
}

const email = session.user.email
const studentId = parseInt(email.substring(1, 10))

const admin = await prisma.admin.findUnique({
where: { id: studentId },
select: null,
})

if (!admin) {
if (!event.context.isAdmin) {
throw createError({
statusCode: 403,
statusMessage: 'Forbidden',
message: '不在管理員名單中',
message: '不是管理員',
})
}

// 執行操作
return await prisma.voting.findMany({
select: {
id: true,
Expand Down
25 changes: 11 additions & 14 deletions server/api/voting/getResult.get.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,15 @@
import prisma from '~/lib/prisma'
import { getServerSession } from '#auth'
export default defineEventHandler(async (event) => {
// 確認權限
if (!event.context.session) {
throw createError({
statusCode: 401,
statusMessage: 'Unauthorized',
message: '未登入',
})
}

// 確認參數
const { id } = getQuery(event) as { id: string | undefined }

if (!id || isNaN(parseInt(id))) {
Expand All @@ -11,19 +20,6 @@ export default defineEventHandler(async (event) => {
})
}

const session = await getServerSession(event) as { user: { email: string } } | null

if (!session) {
throw createError({
statusCode: 401,
statusMessage: 'Unauthorized',
message: '未登入',
})
}

const email = session.user.email
const studentId = parseInt(email.substring(1, 10))

const voting = await prisma.voting.findUniqueOrThrow({
where: { id: parseInt(id) },
select: {
Expand All @@ -49,6 +45,7 @@ export default defineEventHandler(async (event) => {
})
}

const studentId = parseInt(event.context.id)
const admin = await prisma.admin.findUnique({
where: { id: studentId },
select: null,
Expand Down
40 changes: 16 additions & 24 deletions server/api/voting/getVotingGroupCnt.get.ts
Original file line number Diff line number Diff line change
@@ -1,42 +1,34 @@
import prisma from '~/lib/prisma'
import { getServerSession } from '#auth'
export default defineEventHandler(async (event) => {
const { votingId, groupId } = getQuery(event) as { votingId: string | undefined, groupId: string | undefined }

if (!votingId || isNaN(parseInt(votingId)) || !groupId || isNaN(parseInt(groupId))) {
throw createError({
statusCode: 400,
statusMessage: 'Bad Request',
message: 'Parameter "votingId" and "groupId" are required and must be integer.',
})
}

const session = await getServerSession(event) as { user: { email: string } } | null

if (!session) {
// 確認權限
if (!event.context.session) {
throw createError({
statusCode: 401,
statusMessage: 'Unauthorized',
message: '未登入',
})
}

const email = session.user.email
const studentId = parseInt(email.substring(1, 10))

const admin = await prisma.admin.findUnique({
where: { id: studentId },
select: null,
})

if (!admin) {
if (!event.context.isAdmin) {
throw createError({
statusCode: 403,
statusMessage: 'Forbidden',
message: '不在管理員名單中',
message: '不是管理員',
})
}

// 確認參數
const { votingId, groupId } = getQuery(event) as { votingId: string | undefined, groupId: string | undefined }

if (!votingId || isNaN(parseInt(votingId)) || !groupId || isNaN(parseInt(groupId))) {
throw createError({
statusCode: 400,
statusMessage: 'Bad Request',
message: 'Parameter "votingId" and "groupId" are required and must be integer.',
})
}

// 執行操作
const VFG = await prisma.votingFromGroup.findUniqueOrThrow({
where: {
votingId_groupId: {
Expand Down
40 changes: 16 additions & 24 deletions server/api/voting/unarchive.post.ts
Original file line number Diff line number Diff line change
@@ -1,42 +1,34 @@
import prisma from '~/lib/prisma'
import { getServerSession } from '#auth'
export default defineEventHandler(async (event) => {
const { id } = await readBody(event) as { id: string | undefined }

if (!id || isNaN(parseInt(id))) {
throw createError({
statusCode: 400,
statusMessage: 'Bad Request',
message: 'Parameter "id" is required and must be a number.',
})
}

const session = await getServerSession(event) as { user: { email: string } } | null

if (!session) {
// 確認權限
if (!event.context.session) {
throw createError({
statusCode: 401,
statusMessage: 'Unauthorized',
message: '未登入',
})
}

const email = session.user.email
const studentId = email.substring(1, 10)

const admin = await prisma.admin.findUnique({
where: { id: parseInt(studentId) },
select: null,
})

if (!admin) {
if (!event.context.isAdmin) {
throw createError({
statusCode: 403,
statusMessage: 'Forbidden',
message: '不在管理員名單中',
message: '不是管理員',
})
}

// 確認參數
const { id } = await readBody(event) as { id: string | undefined }

if (!id || isNaN(parseInt(id))) {
throw createError({
statusCode: 400,
statusMessage: 'Bad Request',
message: 'Parameter "id" is required and must be a number.',
})
}

// 執行操作
await prisma.voting.update({
where: { id: parseInt(id) },
data: { archive: false },
Expand Down

0 comments on commit 26132ff

Please sign in to comment.