My project is a web application dedicated to language enthusiasts, where users can find language exchange partners to learn with (similar to Tandem), but also includes the option to offer paid classes and other services for certified teachers.
- 404 - As a user, I want to see an appealing 404 page when I navigate to a non-existent page, so I understand it's my mistake.
- 500 - As a user, I want to see a friendly error page when the team makes a mistake, so I know it's not my fault.
- homepage - As a user, I want to access the homepage to understand what the app offers and to log in or sign up.
- sign up - As a user, I want to register on the website so I can view all the events available to attend.
- login - As a user, I want to log in to the website so I can access my account.
- logout - As a user, I want to log out from the website to ensure my account's security.
- events list - As a user, I want to view all available events so I can choose which ones to attend.
- events create - As a user, I want to create an event so I can invite others to join.
- offers - As a user, I want to offer private or group classes, online or in-person, setting my own availability and prices to make my offers attractive and competitive.
- calendar - As a user, I want to easily track, manage, or reschedule my classes using a dynamic calendar.
- reviews - As a student, I want to rate my teacher after the class and share my experience.
- live messages - As a user, I want to keep in touch with my students at any time.
- Live Video - Integrate live video functionality like Zoom and offer public/private video sessions for teaching, similar to Udemy.
- Online Exercises - Allow teachers to create online exercises for students to complete.
- HTML
- CSS
- JavaScript
- Node.js
- Express
- Handlebars
- Sessions & Cookies
- MongoDB & Mongoose
- bcrypt
- multer, cloudinary
- fullcalendar
- socket.io
- stripe
- username: String
- email: String (unique, required)
- password: String (required)
- gender: String
- birthdate: String (required)
- country: String (required)
- profilePic: String
- lang_teach: [String] (default: [])
- lang_learn: [String] (default: [])
- private: Boolean
- professional: Boolean
- stripeAccountId: String
- chats: [ObjectId]
- offers: [ObjectId]
- participants: [ObjectId]
- messages: [ObjectId]
- lastMessageTimestamp: Date (default: null)
- student: ObjectId (required)
- teacher: ObjectId (required)
- date: String (required)
- timeslot: String (required)
- language: String (required)
- level: String (required)
- classType: String (required)
- maxGroupSize: Number
- locationType: String (required)
- location: String
- duration: Number (required)
- isRated: Boolean (default: false)
- reschedule:
- new_date: String
- new_timeslot: String
- status: String
- initiator: String
- creator: ObjectId (required)
- cards: [ObjectId]
- language: String (required)
- level: String (required)
- topic: String (required)
- front: String (required)
- back: String (required)
- priority: Number (default: 0)
- sender: ObjectId
- recipient: ObjectId
- message: String
- timestamp: Date (default: Date.now)
- source: ObjectId
- target: ObjectId
- type: String
- read: Boolean (default: false)
- createdAt: Date (default: Date.now)
- name: String (required)
- language: String (required)
- level: String (required)
- locationType: String (required)
- location: String
- duration: Number (required)
- classType: String (required)
- maxGroupSize: Number (default: 2)
- price: Number (required)
- timeslots: [String] (required)
- weekdays: [String] (required)
- author: ObjectId (required)
- subject: ObjectId (required)
- rating: Number (required)
- text: String (required)
- date: String (required)
- language: String (required)
- level: String (required)
- classType: String (required)
- locationType: String (required)
- Repository: Repository Link
- Deployment: Deployment Link
- Developer 1: Amir Vaknin
- Developer 2: Tiago Laibaças