Tests, UX improvements.
This commit is contained in:
parent
4e6f5d36b8
commit
0ae18f495e
63 changed files with 1384 additions and 2330 deletions
|
|
@ -2,7 +2,7 @@ import Member from '../../../models/member.js'
|
|||
import { connectDB } from '../../../utils/mongoose.js'
|
||||
|
||||
export default defineEventHandler(async (event) => {
|
||||
await requireAdmin(event)
|
||||
const admin = await requireAdmin(event)
|
||||
|
||||
const body = await validateBody(event, adminMemberUpdateSchema)
|
||||
const memberId = getRouterParam(event, 'id')
|
||||
|
|
@ -30,6 +30,29 @@ export default defineEventHandler(async (event) => {
|
|||
status: body.status,
|
||||
}, { new: true })
|
||||
|
||||
// Log admin profile update
|
||||
const changedFields = []
|
||||
if (existing.name !== body.name) changedFields.push('name')
|
||||
if (existing.email !== body.email) changedFields.push('email')
|
||||
if (existing.circle !== body.circle) changedFields.push('circle')
|
||||
if (existing.contributionTier !== body.contributionTier) changedFields.push('contributionTier')
|
||||
if (existing.status !== body.status) changedFields.push('status')
|
||||
|
||||
if (changedFields.length) {
|
||||
logActivity(memberId, 'admin_profile_update', {
|
||||
fields: changedFields,
|
||||
changedBy: admin.name
|
||||
}, { performedBy: admin._id })
|
||||
}
|
||||
|
||||
// Log status change separately for admin-only visibility
|
||||
if (existing.status !== body.status) {
|
||||
logActivity(memberId, 'status_changed', {
|
||||
from: existing.status,
|
||||
to: body.status
|
||||
}, { performedBy: admin._id })
|
||||
}
|
||||
|
||||
return {
|
||||
_id: updated._id,
|
||||
name: updated.name,
|
||||
|
|
|
|||
28
server/api/admin/members/[id]/activity.get.js
Normal file
28
server/api/admin/members/[id]/activity.get.js
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
import ActivityLog from '../../../../models/activityLog.js'
|
||||
|
||||
export default defineEventHandler(async (event) => {
|
||||
await requireAdmin(event)
|
||||
|
||||
const id = getRouterParam(event, 'id')
|
||||
|
||||
const query = getQuery(event)
|
||||
const limit = Math.min(parseInt(query.limit) || 20, 50)
|
||||
const before = query.before ? new Date(query.before) : null
|
||||
|
||||
const filter = { member: id }
|
||||
if (before) filter.timestamp = { $lt: before }
|
||||
|
||||
const entries = await ActivityLog.find(filter)
|
||||
.sort({ timestamp: -1 })
|
||||
.limit(limit + 1)
|
||||
.lean()
|
||||
|
||||
const hasMore = entries.length > limit
|
||||
if (hasMore) entries.pop()
|
||||
|
||||
const nextCursor = hasMore && entries.length
|
||||
? entries[entries.length - 1].timestamp.toISOString()
|
||||
: null
|
||||
|
||||
return { entries, hasMore, nextCursor }
|
||||
})
|
||||
|
|
@ -18,18 +18,25 @@ export default defineEventHandler(async (event) => {
|
|||
})
|
||||
}
|
||||
|
||||
const member = await Member.findByIdAndUpdate(
|
||||
memberId,
|
||||
{ role },
|
||||
{ new: true }
|
||||
)
|
||||
|
||||
if (!member) {
|
||||
const existing = await Member.findById(memberId)
|
||||
if (!existing) {
|
||||
throw createError({
|
||||
statusCode: 404,
|
||||
statusMessage: 'Member not found.'
|
||||
})
|
||||
}
|
||||
|
||||
const oldRole = existing.role
|
||||
const member = await Member.findByIdAndUpdate(
|
||||
memberId,
|
||||
{ role },
|
||||
{ new: true }
|
||||
)
|
||||
|
||||
logActivity(memberId, 'role_changed', {
|
||||
from: oldRole,
|
||||
to: role
|
||||
}, { performedBy: admin._id })
|
||||
|
||||
return { success: true, member }
|
||||
})
|
||||
|
|
|
|||
|
|
@ -100,6 +100,12 @@ export default defineEventHandler(async (event) => {
|
|||
{ runValidators: false }
|
||||
)
|
||||
|
||||
logActivity(member._id, 'email_sent', {
|
||||
emailType: 'invite',
|
||||
subject: "You're invited to Ghost Guild",
|
||||
body: emailText
|
||||
})
|
||||
|
||||
results.push({ memberId: member._id, email: member.email, success: true })
|
||||
} catch (err) {
|
||||
results.push({ memberId: member._id, email: member.email, success: false, error: err.message })
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue