= ЕР Дијаграм = [[Image(shifter_er_diagram.drawio.png, 1000px)]] ---- == Податочни побарувања == === Ентитети === 1. **Account** – ентитет кој чува универзални податоци за секој корисник (обичен или експерт) - id (primary key, bigint) - email (string, задолжително) - password_hash (string, задолжително) - name (string, задолжително) 2. **User** – ентитет кој чува податоци за крајните корисници (клиенти) - user_id (primary key, bigint) - name (string, задолжително) - email (string, задолжително) - password_hash (string, задолжително) - login_provider (enum {local, google}, задолжително) - is_verified(boolean, задолжително - за мејл верификација) - is_profile_complete (boolean, задолжително - за персонализирање на профил) - has_used_free_consultation (boolean, задолжително) - work_position (string, задолжително) - company_size (enum {freelance, micro, small, medium, mid_market, enterprise, other}, задолжително) - points (int, задолжително) - account_id (foreign key, bigint) 3. **Expert** – ентитет кој чува податоци за експертот - expert_id (primary key, bigint) - account_id (foreign key, bigint) 4. **Enrollment** – ентитет кој чува податоци за превземање на курс од страна на клиент - enrollment_id (primary key, bigint) - enrollment_status (enum {pending, active, completed}, задолжително) - activation_date (date, задолжително) - completion_date (date, задолжително) - purchase_date (date, задолжително) - user_id (foreign key, bigint) - course_version_id (foreign key, bigint) 5. **Payment** – ентитет кој чува податоци за наплатата на корисниците за курс - payment_id (primary key, bigint) - ammount(double, задолжително) - payment_date (date, задолжително) - payment_method (enum {card, paypal, casys}, задолжително) - payment_status (enum {pending, completed, failed}, задолжително) - enrollmend_id (foreign_key, bigint) 6. **Review** – ентитет кој чува податоци за оценките и коментарите за курс - review_id (primary key, bigint) - rating (int, задолжително) - comment (string, задолжително) - review_date (date, задолжително) - enrollmend_id (foreign_key, bigint) 7. **Course Version** – ентитет кој чува податоци за верзиите на курсеви - courseVersion_id (primary key, bigint) - version_number (int, задолжително) - created_at (date, задолжително) - is_active (boolean, задолжително) - course_id (foreign_key, bigint) 8. **Course** – ентитет кој чува податоци за курсевите - course_id (primary key, bigint) - color (string, задолжително) - difficulty (enum {beginner, intermediate, advanced, expert}, задолжително) - duration_minutes (int, задолжително) - image_url (string, задолжително) - price (double, задолжително) 9. **Course Translate** – ентитет кој чува податоци за различните преведувања за одреден курс - course_translate_id (primary key, bigint) - description_short(string, задолжително) - description (string, задолжително) - description_long (string, задолжително) - title_short (string, задолжително) - title (string, задолжително) - what_will_be_learned (string[], задолжително) - course_id (foreign_key, bigint) - language_id (foreign_key, bigint) 10. **Course Content** – ентитет кој чува податоци за различните модули за одреден курс - course_content_id (primary key, bigint) - position (int, задолжително) - course_version_id (foreign_key, bigint) 11. **Course Content Translate** – ентитет кој чува податоци за различните преводи на модули за одреден курс - course_content_translate_id (primary key, bigint) - title(string, задолжително) - course_content_id (foreign_key, bigint) - language_id (foreign_key, bigint) 12. **Course Lecture** – ентитет кој чува податоци за различните лекции за одреден модул на курс - course_lecture_id (primary key, bigint) - position(int, задолжително) - duration_minutes (int, задолжително) - content_type (enum {text, file, video, quiz}, задолжително) - course_content_id (foreign_key, bigint) 13. **Course Lecture Translate** – ентитет кој чува податоци за различните преведувања за лекции за одреден модул на курс - course_lecture_translate_id (primary key, bigint) - content_file_name (string, задолжително) - content_text (string, задолжително) - description (string, задолжително) - title (string, задолжително) - course_lecture_id (foreign_key, bigint) - language_id (foreign_key, bigint) 14. **User Course Progress** – ентитет кој чува податоци за прогресот на корисник за лекција на одреден курс - user_course_progress_id (primary key, bigint) - is_completed (boolean, задолжително) - completed_at (timestamp, задолжително) - course_lecture_id (foreign_key, bigint) - enrollment_id (foreign_key, bigint) 15. **Verification Token** – ентитет кој чува податоци за токените кои се креирани за корисници да го верифицираат нивниот мејл - verification_token_uuid (primary key, uuid) - expires_at (timestamp, задолжително) - created_at (timestamp, задолжително) - user_id (foreign_key, bigint) 16. **Tag** – ентитет кој чува податоци за тагови (вештини и интереси) кои се мапираат за корисници и курсеви - tag_id (primary key, bigint) - tag_type (enum {skill, topic}, задолжително) 17. ** Tag Translate** – ентитет кој чува податоци за различни преведувања за секој од таговите (вештини и интереси) - tag_translate_id (primary key, bigint) - value (string, задолжително) - tag_id (foreign_key, bigint) - language_id (foreign_key, bigint) 18. **User Tag** – слаб ентитет кој чува податоци за таговите (вештини и интереси) за секој корисник - tag_id (foreign_key, bigint) - user_id (foreign_key, bigint) 19. **Course Tag** – слаб ентитет кој чува податоци за таговите (вештини и интереси) за секој курс - tag_id (foreign_key, bigint) - course_id (foreign_key, bigint) 20. **Meeting Email Reminder** – ентитет кој чува податоци за на кои корисници треба да им се испрати потсетник на нивната емаил адреса - id (primary key, bigint) - meting_at (timestamp, задолжително) - scheduled_at (timestamp, задолжително) - sent (boolean, задолжително) - meeting_ling (string, задолжително) - user_id (foreign_key, bigint) 21. **User Favorite Course** – ентитет кој чува податоци за омилени курсеви на корисници - id (primary key, bigint) - user_id (foreign_key, bigint) - course_id (foreign_key, bigint) 22. **Language** – ентитет кој чува јазици - id (primary key, bigint) - value (string, задолжително) ---- === Релации === 1. **user_has_verification_token** (USER ↔ VERIFICATION_TOKEN, 1:1)\\ Секој User има точно еден Verification_Token.\\ Секој Verification_Token припаѓа точно на еден User. 2. **user_is_enrolled** (USER ↔ ENROLLMENT, 1:N)\\ Еден User може да има повеќе Enrollments.\\ Секое Enrollment припаѓа на точно еден User. 3. **payment_for_enrollment** (PAYMENT ↔ ENROLLMENT, 1:1) \\ Секоја инстанца на Payment има точно една инстанца на Enrollment.\\ Секоја инстанца на Enrollment може да припаѓа на точно една инстанца на Payment. 4. **review_for_enrollment** (REVIEW ↔ ENROLLMENT, 1:1) \\ Секоја инстанца на Review има точно една инстанца на Enrollment.\\ Секоја инстанца на Enrollment може да припаѓа на точно една инстанца на Review. 5. **enrollment_for_course_version** (ENROLLMENT ↔ COURSE_VERSION, N:1)\\ Секоја инстанца на Enrollment има точно една инстанца на Course_Version.\\ Една инстанца на Course_Version може да биде дел од повеќе инстанци на Enrollment. 6. **version_for_course** (COURSE ↔ COURSE_VERSION, 1:N) \\ Една инстанца на Course може да има повеќе инстанци на Course_Version.\\ Секоја инстанца на Course_Version припаѓа на точно една инстанца на Course. 7. **translation_for_course** (COURSE_TRANSLATE ↔ COURSE, N:1) \\ Секоја инстанца на Course_Translate припаѓа на точно една инстанца на Course.\\ Една инстанца на Course може да има повеќе инстанци на Course_Translate. 8. **content_for_version** (COURSE_VERSION ↔ COURSE_CONTENT, 1:N) \\ Една инстанца на Course_Version може да има повеќе инстанци на Course_Content.\\ Секоја инстанца на Course_Content припаѓа на точно една инстанца на Course_Version. 9. **translation_for_content** (COURSE_CONTENT ↔ COURSE_CONTENT_TRANSLATE, 1:N) \\ Една инстанца на Course_Content може да има повеќе инстанци на Course_Content_Translate.\\ Секоја инстанца на Course_Content_Translate припаѓа на точно една инстанца на Course_Content. 10. **lecture_for_content** (COURSE_CONTENT ↔ COURSE_LECTURE, 1:N) \\ Една инстанца на Course_Content може да има повеќе инстанци на Course_Lecture.\\ Секоја инстанца на Course_Lecture припаѓа на точно една инстанца на Course_Content. 11. **translation_for_lecture** (COURSE_LECTURE ↔ COURSE_LECTURE_TRANSLATE, 1:N) \\ Една инстанца на Course_Lecture може да има повеќе инстанци на Course_Lecture_Translate.\\ Секоја инстанца на Course_Lecture_Translate припаѓа на точно една инстанца на Course_Lecture. 12. **has_progress** (COURSE_LECTURE 1 ──< USER_COURSE_PROGRESS >── 1 ENROLLMENT) \\ Секоја инстанца на User_Course_Progress се однесува на точно една инстанца на Course_Lecture и точно една инстанца на Enrollment.\\ Една инстанца на Course_Lecture може да биде поврзана со повеќе инстанци на User_Course_Progress.\\ Една инстанца на Enrollment може да биде поврзана со повеќе инстанци на User_Course_Progress. 13. **course_tags** (COURSE ↔ TAG, N:N) \\ Секој COURSE мора да има барем еден TAG.\\ Секој TAG мора да има барем еден COURSE. 14. **user_tags** (USER ↔ TAG, N:N) \\ Секој User може да има повеќе TAG-ови.\\ Секој TAG може да има припаѓа на повеќе User-и. 15. **translation_for_tag** (TAG ↔ TAG_TRANSLATION, 1:N) \\ Секој TAG може да има повеќе Tag_Translation.\\ Секој Tag_Translation припаѓа на точно на еден TAG. 16. **expert_course** (EXPERT ↔ COURSE, N:N)\\ Секој Expert може да има повеќе Course.\\ Секој Course мора да има барем еден Expert. 17. **user_has_reminder** (USER ↔ MEETING_EMAIL_REMINDER, 1:N)\\ Секој User може да има повеќе Meeting_Email_Reminder.\\ Секој Meeting_Email_Reminder мора да има барем еден User. 18. **user_is_favoriting** (USER ↔ USER_FAVORITE_COURSE, 1:N)\\ Секој User може да има повеќе User_Favorite_Course.\\ Секој User_Favorite_Course мора да има барем еден User. 19. **course_is_favorited** (COURSE ↔ USER_FAVORITE_COURSE, 1:N)\\ Секој Course може да има повеќе User_Favorite_Course.\\ Секој User_Favorite_Course мора да има барем еден Course. 20. **language_for_tag_translate** (LANGUAGE ↔ TAG_TRANSLATE, 1:N)\\ Секој Language може да има повеќе Tag_Translate.\\ Секој Tag_Translate мора да има барем еден Language. 21. **language_for_course_translate** (LANGUAGE ↔ COURSE_TRANSLATE, 1:N)\\ Секој Language може да има повеќе Course_Translate.\\ Секој Course_Translate мора да има барем еден Language. 22. **language_for_content_translate** (LANGUAGE ↔ COURSE_CONTENT_TRANSLATE, 1:N)\\ Секој Language може да има повеќе Course_Content_Translate.\\ Секој Course_Content_Translate мора да има барем еден Language. 23. **language_for_lecture_translate** (LANGUAGE ↔ COURSE_LECTURE_TRANSLATE, 1:N)\\ Секој Language може да има повеќе Course_Lecture_Translate.\\ Секој Course_Lecture_Translate мора да има барем еден Language. ----