Complete sermon itinerary application with Nuxt 3, SQLite, authentication, and Docker deployment
This commit is contained in:
30
server/api/auth/login.post.ts
Normal file
30
server/api/auth/login.post.ts
Normal file
@@ -0,0 +1,30 @@
|
||||
import { getUserByUsername } from '~/server/utils/database'
|
||||
import { setAuthCookie } from '~/server/utils/auth'
|
||||
|
||||
export default defineEventHandler(async (event) => {
|
||||
const body = await readBody(event)
|
||||
const { username, password } = body
|
||||
|
||||
if (!username || !password) {
|
||||
throw createError({
|
||||
statusCode: 400,
|
||||
message: 'Username and password are required'
|
||||
})
|
||||
}
|
||||
|
||||
const user = getUserByUsername(username)
|
||||
|
||||
if (!user || user.password !== password) {
|
||||
throw createError({
|
||||
statusCode: 401,
|
||||
message: 'Invalid credentials'
|
||||
})
|
||||
}
|
||||
|
||||
setAuthCookie(event, username)
|
||||
|
||||
return {
|
||||
success: true,
|
||||
username: user.username
|
||||
}
|
||||
})
|
||||
9
server/api/auth/logout.post.ts
Normal file
9
server/api/auth/logout.post.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import { clearAuthCookie } from '~/server/utils/auth'
|
||||
|
||||
export default defineEventHandler(async (event) => {
|
||||
clearAuthCookie(event)
|
||||
|
||||
return {
|
||||
success: true
|
||||
}
|
||||
})
|
||||
9
server/api/auth/verify.get.ts
Normal file
9
server/api/auth/verify.get.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import { isAuthenticated } from '~/server/utils/auth'
|
||||
|
||||
export default defineEventHandler(async (event) => {
|
||||
const authenticated = isAuthenticated(event)
|
||||
|
||||
return {
|
||||
authenticated
|
||||
}
|
||||
})
|
||||
23
server/api/sermons/[slug].get.ts
Normal file
23
server/api/sermons/[slug].get.ts
Normal file
@@ -0,0 +1,23 @@
|
||||
import { getSermonBySlug } from '~/server/utils/database'
|
||||
|
||||
export default defineEventHandler(async (event) => {
|
||||
const slug = getRouterParam(event, 'slug')
|
||||
|
||||
if (!slug) {
|
||||
throw createError({
|
||||
statusCode: 400,
|
||||
message: 'Slug is required'
|
||||
})
|
||||
}
|
||||
|
||||
const sermon = getSermonBySlug(slug)
|
||||
|
||||
if (!sermon) {
|
||||
throw createError({
|
||||
statusCode: 404,
|
||||
message: 'Sermon not found'
|
||||
})
|
||||
}
|
||||
|
||||
return sermon
|
||||
})
|
||||
10
server/api/sermons/index.get.ts
Normal file
10
server/api/sermons/index.get.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
import { getAllSermons } from '~/server/utils/database'
|
||||
|
||||
export default defineEventHandler(async (event) => {
|
||||
const query = getQuery(event)
|
||||
const limit = query.limit ? parseInt(query.limit as string) : undefined
|
||||
|
||||
const sermons = getAllSermons(limit)
|
||||
|
||||
return sermons
|
||||
})
|
||||
43
server/api/sermons/index.post.ts
Normal file
43
server/api/sermons/index.post.ts
Normal file
@@ -0,0 +1,43 @@
|
||||
import { createSermon } from '~/server/utils/database'
|
||||
import { isAuthenticated } from '~/server/utils/auth'
|
||||
|
||||
export default defineEventHandler(async (event) => {
|
||||
// Check authentication
|
||||
if (!isAuthenticated(event)) {
|
||||
throw createError({
|
||||
statusCode: 401,
|
||||
message: 'Unauthorized'
|
||||
})
|
||||
}
|
||||
|
||||
const body = await readBody(event)
|
||||
const { slug, title, date, bible_references, personal_appliance, pastors_challenge } = body
|
||||
|
||||
if (!slug || !title || !date || !bible_references || !personal_appliance || !pastors_challenge) {
|
||||
throw createError({
|
||||
statusCode: 400,
|
||||
message: 'All fields are required'
|
||||
})
|
||||
}
|
||||
|
||||
try {
|
||||
createSermon({
|
||||
slug,
|
||||
title,
|
||||
date,
|
||||
bible_references,
|
||||
personal_appliance,
|
||||
pastors_challenge
|
||||
})
|
||||
|
||||
return {
|
||||
success: true,
|
||||
message: 'Sermon created successfully'
|
||||
}
|
||||
} catch (error: any) {
|
||||
throw createError({
|
||||
statusCode: 500,
|
||||
message: error.message || 'Failed to create sermon'
|
||||
})
|
||||
}
|
||||
})
|
||||
Reference in New Issue
Block a user