Initial commit
This commit is contained in:
commit
92e96b9107
85 changed files with 24969 additions and 0 deletions
76
app/server/api/articles/index.get.ts
Normal file
76
app/server/api/articles/index.get.ts
Normal file
|
|
@ -0,0 +1,76 @@
|
|||
import { Article } from '../../models/Article'
|
||||
import { checkAccessLevel } from '../../utils/auth'
|
||||
|
||||
export default defineEventHandler(async (event) => {
|
||||
const query = getQuery(event)
|
||||
|
||||
// Pagination
|
||||
const page = parseInt(query.page as string) || 1
|
||||
const limit = parseInt(query.limit as string) || 20
|
||||
const skip = (page - 1) * limit
|
||||
|
||||
// Build filter
|
||||
const filter: any = { status: 'published' }
|
||||
|
||||
// Category filter
|
||||
if (query.category) {
|
||||
filter.category = query.category
|
||||
}
|
||||
|
||||
// Tags filter
|
||||
if (query.tags) {
|
||||
const tags = (query.tags as string).split(',')
|
||||
filter.tags = { $in: tags }
|
||||
}
|
||||
|
||||
// Search filter
|
||||
if (query.search) {
|
||||
filter.$or = [
|
||||
{ title: { $regex: query.search, $options: 'i' } },
|
||||
{ description: { $regex: query.search, $options: 'i' } },
|
||||
{ content: { $regex: query.search, $options: 'i' } }
|
||||
]
|
||||
}
|
||||
|
||||
// Get articles
|
||||
const articles = await Article.find(filter)
|
||||
.populate('author', 'username displayName avatar')
|
||||
.select('-content -revisions -comments')
|
||||
.sort({ publishedAt: -1 })
|
||||
.skip(skip)
|
||||
.limit(limit)
|
||||
|
||||
// Filter by access level
|
||||
const filteredArticles = []
|
||||
for (const article of articles) {
|
||||
const hasAccess = await checkAccessLevel(
|
||||
event,
|
||||
article.accessLevel,
|
||||
article.cohorts
|
||||
)
|
||||
|
||||
if (hasAccess) {
|
||||
filteredArticles.push(article)
|
||||
} else if (article.accessLevel === 'member' || article.accessLevel === 'cohort') {
|
||||
// Show preview for protected content
|
||||
filteredArticles.push({
|
||||
...article.toObject(),
|
||||
description: article.description.substring(0, 200) + '...',
|
||||
restricted: true
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// Get total count
|
||||
const total = await Article.countDocuments(filter)
|
||||
|
||||
return {
|
||||
articles: filteredArticles,
|
||||
pagination: {
|
||||
page,
|
||||
limit,
|
||||
total,
|
||||
pages: Math.ceil(total / limit)
|
||||
}
|
||||
}
|
||||
})
|
||||
Loading…
Add table
Add a link
Reference in a new issue