Skip to main content

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[]
questions
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[]
eventId
string
Filter by specific event ID
responses
FeedbackResponse[]
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
data.eventId
string
required
Event ID
data.userId
string
required
User ID
data.userName
string
required
User name
data.submittedAt
string
required
Submission timestamp
data.answers
array
required
Array of question answers
data.overallRating
number
required
Overall rating (1-5)
response
FeedbackResponse
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
userId
string
required
User ID to check
isBlocked
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[]
userId
string
Filter by user ID
badges
MemberBadge[]
Array of badges
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
data.userId
string
required
Recipient user ID
data.type
BadgeType
required
‘estrella’ | ‘medalla_bronce’ | ‘medalla_plata’ | ‘medalla_oro’ | ‘especial’
data.label
string
required
Badge label/name
data.reason
string
required
Reason for awarding
data.awardedAt
string
required
Timestamp
data.awardedBy
string
required
Admin user ID who awarded it
badge
MemberBadge
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
id
string
required
Badge ID to remove

Participation Tracking

getParticipation

Retrieve participation records.
db.gamification.getParticipation(userId?: string): ParticipationRecord[]
userId
string
Filter by user ID
records
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
data.userId
string
required
User ID
data.eventId
string
required
Event ID
data.eventTitle
string
required
Event title
data.participatedAt
string
required
Timestamp
data.feedbackSubmitted
boolean
required
Whether feedback was submitted
data.feedbackBlocksNext
boolean
required
Whether lack of feedback blocks next event
record
ParticipationRecord
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;
}>
ranking
array
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}`);

Build docs developers (and LLMs) love