Overview
The Virtual Meetings module provides comprehensive post-session feedback, gamification with badges, and participation tracking for Zoom-based virtual meetings.
Feedback Management
getQuestions
Retrieve active feedback questions.
db.feedback.getQuestions(): FeedbackQuestion[]
Array of feedback questions
Example:
const questions = db.feedback.getQuestions();
const active = questions.filter(q => q.isActive);
saveQuestions
Update feedback questions configuration.
db.feedback.saveQuestions(
questions: FeedbackQuestion[]
): FeedbackQuestion[]
questions
FeedbackQuestion[]
required
Complete array of questions
Example:
db.feedback.saveQuestions([
{
id: 'fq_1',
order: 1,
text: '¿Cómo evaluarías la sesión?',
type: 'rating',
isActive: true
},
{
id: 'fq_2',
order: 2,
text: '¿Qué te gustó más?',
type: 'multiple_choice',
options: ['La temática', 'La dinámica', 'El facilitador'],
isActive: true
}
]);
getResponses
Retrieve feedback responses, optionally filtered by event.
db.feedback.getResponses(eventId?: string): FeedbackResponse[]
Filter by specific event ID
Array of feedback responses
Example:
// All responses
const allResponses = db.feedback.getResponses();
// Responses for specific event
const eventResponses = db.feedback.getResponses('ev_123');
const avgRating = eventResponses.reduce((sum, r) =>
sum + r.overallRating, 0
) / eventResponses.length;
submitResponse
Submit feedback after attending an event.
db.feedback.submitResponse(
data: Omit<FeedbackResponse, 'id'>
): FeedbackResponse
Array of question answers
The submitted response with ID
Example:
const response = db.feedback.submitResponse({
eventId: 'ev_123',
userId: 'u_456',
userName: 'Juan Pérez',
submittedAt: new Date().toISOString(),
overallRating: 5,
answers: [
{
questionId: 'fq_1',
questionText: '¿Cómo evaluarías la sesión?',
value: 5
},
{
questionId: 'fq_2',
questionText: '¿Qué te gustó más?',
value: 'La temática'
}
]
});
Submitting feedback automatically updates the participant’s record and removes any blocking flags.
hasBlockingFeedback
Check if a user has pending feedback that blocks future participation.
db.feedback.hasBlockingFeedback(userId: string): boolean
True if user has blocking pending feedback
Example:
const isBlocked = db.feedback.hasBlockingFeedback('u_456');
if (isBlocked) {
alert('Please submit feedback from your last session before joining.');
}
Gamification
getBadges
Retrieve badges, optionally filtered by user.
db.gamification.getBadges(userId?: string): MemberBadge[]
Example:
// All badges
const allBadges = db.gamification.getBadges();
// User's badges
const userBadges = db.gamification.getBadges('u_456');
console.log(`${userBadges.length} badges earned`);
awardBadge
Award a badge to a member.
db.gamification.awardBadge(
data: Omit<MemberBadge, 'id'>
): MemberBadge
‘estrella’ | ‘medalla_bronce’ | ‘medalla_plata’ | ‘medalla_oro’ | ‘especial’
Admin user ID who awarded it
The created badge with ID
Example:
const badge = db.gamification.awardBadge({
userId: 'u_456',
type: 'medalla_oro',
label: 'Perfect Attendance',
reason: 'Attended 10 consecutive sessions',
awardedAt: new Date().toISOString(),
awardedBy: 'u_admin'
});
removeBadge
Revoke a badge.
db.gamification.removeBadge(id: string): void
Participation Tracking
getParticipation
Retrieve participation records.
db.gamification.getParticipation(userId?: string): ParticipationRecord[]
Array of participation records
Example:
const participation = db.gamification.getParticipation('u_456');
console.log(`Attended ${participation.length} events`);
recordParticipation
Record a user’s participation in an event.
db.gamification.recordParticipation(
data: Omit<ParticipationRecord, 'id'>
): ParticipationRecord
Whether feedback was submitted
Whether lack of feedback blocks next event
The created record with ID
Example:
const record = db.gamification.recordParticipation({
userId: 'u_456',
eventId: 'ev_123',
eventTitle: 'Meditation Workshop',
participatedAt: new Date().toISOString(),
feedbackSubmitted: false,
feedbackBlocksNext: true
});
getRanking
Get leaderboard ranking based on participation and badges.
db.gamification.getRanking(): Array<{
userId: string;
userName: string;
points: number;
badges: number;
participations: number;
}>
Sorted array of user rankings
Example:
const ranking = db.gamification.getRanking();
console.log('Top 3:');
ranking.slice(0, 3).forEach((user, i) => {
console.log(`${i + 1}. ${user.userName}: ${user.points} points`);
});
Points System:
- Participation: 5 points
- Participation + Feedback: 10 points
- Badge awarded: 20 points
Types Reference
FeedbackQuestion
interface FeedbackQuestion {
id: string;
order: number;
text: string;
type: 'rating' | 'multiple_choice' | 'text';
options?: string[]; // For multiple_choice
isActive: boolean;
}
FeedbackResponse
interface FeedbackResponse {
id: string;
eventId: string;
userId: string;
userName: string;
submittedAt: string;
answers: {
questionId: string;
questionText: string;
value: string | number;
}[];
overallRating: number; // 1-5
}
MemberBadge
type BadgeType =
| 'estrella'
| 'medalla_bronce'
| 'medalla_plata'
| 'medalla_oro'
| 'especial';
interface MemberBadge {
id: string;
userId: string;
type: BadgeType;
label: string;
reason: string;
awardedAt: string;
awardedBy: string;
}
ParticipationRecord
interface ParticipationRecord {
id: string;
userId: string;
eventId: string;
eventTitle: string;
participatedAt: string;
feedbackSubmitted: boolean;
feedbackBlocksNext: boolean;
}
Complete Workflow Example
// 1. User joins a meeting
const userId = 'u_456';
const eventId = 'ev_123';
// 2. Record participation
db.gamification.recordParticipation({
userId,
eventId,
eventTitle: 'Weekly Meditation',
participatedAt: new Date().toISOString(),
feedbackSubmitted: false,
feedbackBlocksNext: true // Blocks until feedback submitted
});
// 3. User submits feedback after event
db.feedback.submitResponse({
eventId,
userId,
userName: 'Juan Pérez',
submittedAt: new Date().toISOString(),
overallRating: 5,
answers: [
{ questionId: 'fq_1', questionText: 'Rating?', value: 5 }
]
});
// This automatically removes the block
// 4. Check if eligible for badge
const participations = db.gamification.getParticipation(userId);
if (participations.length >= 10) {
db.gamification.awardBadge({
userId,
type: 'medalla_oro',
label: '10 Sessions Milestone',
reason: 'Attended 10 sessions',
awardedAt: new Date().toISOString(),
awardedBy: 'u_admin'
});
}
// 5. View user's ranking
const ranking = db.gamification.getRanking();
const userRank = ranking.findIndex(r => r.userId === userId) + 1;
console.log(`User is ranked #${userRank}`);