Initial commit
This commit is contained in:
commit
92e96b9107
85 changed files with 24969 additions and 0 deletions
71
app/server/api/articles/[slug].get.ts
Normal file
71
app/server/api/articles/[slug].get.ts
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
import { Article } from '../../models/Article'
|
||||
import { checkAccessLevel, verifyAuth } from '../../utils/auth'
|
||||
|
||||
export default defineEventHandler(async (event) => {
|
||||
const slug = getRouterParam(event, 'slug')
|
||||
|
||||
if (!slug) {
|
||||
throw createError({
|
||||
statusCode: 400,
|
||||
statusMessage: 'Slug is required'
|
||||
})
|
||||
}
|
||||
|
||||
// Find article
|
||||
const article = await Article.findOne({ slug })
|
||||
.populate('author', 'username displayName avatar')
|
||||
.populate('contributors', 'username displayName avatar')
|
||||
|
||||
if (!article) {
|
||||
throw createError({
|
||||
statusCode: 404,
|
||||
statusMessage: 'Article not found'
|
||||
})
|
||||
}
|
||||
|
||||
// Check access
|
||||
const hasAccess = await checkAccessLevel(
|
||||
event,
|
||||
article.accessLevel,
|
||||
article.cohorts
|
||||
)
|
||||
|
||||
if (!hasAccess) {
|
||||
// For protected content, return limited preview
|
||||
if (article.accessLevel !== 'admin') {
|
||||
return {
|
||||
slug: article.slug,
|
||||
title: article.title,
|
||||
description: article.description.substring(0, 200) + '...',
|
||||
category: article.category,
|
||||
tags: article.tags,
|
||||
accessLevel: article.accessLevel,
|
||||
restricted: true,
|
||||
message: 'This content requires authentication'
|
||||
}
|
||||
}
|
||||
|
||||
throw createError({
|
||||
statusCode: 403,
|
||||
statusMessage: 'Access denied'
|
||||
})
|
||||
}
|
||||
|
||||
// Increment view count
|
||||
article.views += 1
|
||||
await article.save()
|
||||
|
||||
// Get user to check if they've liked
|
||||
const user = await verifyAuth(event)
|
||||
const userLiked = false // TODO: Implement likes tracking
|
||||
|
||||
return {
|
||||
...article.toObject(),
|
||||
userLiked,
|
||||
revisionCount: article.revisions.length,
|
||||
commentCount: article.comments.length,
|
||||
// Don't send full revisions and comments in main response
|
||||
revisions: undefined,
|
||||
comments: undefined
|
||||
}
|
||||
})
|
||||
Loading…
Add table
Add a link
Reference in a new issue