= ЕР Дијаграм = [[Image(shifter_er.png, 1000px)]] ---- == Податочни побарувања == === Ентитети === 1. **User** – ентитет кој чува податоци за крајните корисници (клиенти) - user_id (primary key, bigint) - name (string, задолжително) - email (string, задолжително) - password_hash (string, задолжително) - loginProvider (enum {local, google}, задолжително) - isVerified(boolean, задолжително - за мејл верификација) - isProfileComplete (boolean, задолжително - за персонализирање на профил) - hasUsedFreeConsultation (boolean, задолжително) - workPosition (string, задолжително) - companySize (enum {freelance, micro, small, medium, mid_market, enterprise, other}, задолжително) - points (int, задолжително) - favoriteCourseIds (int[], задолжително) 2. **Expert** – ентитет кој чува податоци за експертот - expert_id (primary key, bigint) - email (string, задолжително) - password_hash (string, задолжително) - name (string, задолжително) 3. **Enrollment** – ентитет кој чува податоци за превземање на курс од страна на клиент - enrollment_id (primary key, bigint) - enrollmentStatus (enum {pending, active, completed}, задолжително) - activationDate (date, задолжително) - completionDate (date, задолжително) - purchaseDate (date, задолжително) - user_id (foreign key, bigint) - course_version_id (foreign key, bigint) 4. **Payment** – ентитет кој чува податоци за наплатата на корисниците за курс - payment_id (primary key, bigint) - ammount(double, задолжително) - paymentDate (date, задолжително) - paymentMethod (enum {card, paypal, casys}, задолжително) - paymentStatus (enum {pending, completed, failed}, задолжително) - enrollmend_id (foreign_key, bigint) 5. **Review** – ентитет кој чува податоци за оценките и коментарите за курс - review_id (primary key, bigint) - rating (int, задолжително) - comment (string, задолжително) - reviewDate (date, задолжително) - enrollmend_id (foreign_key, bigint) 6. **Course Version** – ентитет кој чува податоци за верзиите на курсеви - course_version_id (primary key, bigint) - versionNumber (int, задолжително) - createdAt (date, задолжително) - isActive (boolean, задолжително) - course_id (foreign_key, bigint) 7. **Course** – ентитет кој чува податоци за курсевите - course_id (primary key, bigint) - color (string, задолжително) - difficulty (enum {beginner, intermediate, advanced, expert}, задолжително) - durationMinutes (int, задолжително) - imageUrl (string, задолжително) - prica (double, задолжително) 8. **Course Translate** – ентитет кој чува податоци за различните преведувања за одреден курс - course_translate_id (primary key, bigint) - language (string, задолжително) - descriptionShort(string, задолжително) - description (string, задолжително) - descriptionLong (string, задолжително) - titleShort (string, задолжително) - title (string, задолжително) - whatWillBeLearned (string[], задолжително) - course_id (foreign_key, bigint) 9. **Course Content** – ентитет кој чува податоци за различните модули за одреден курс - course_content_id (primary key, bigint) - position (int, задолжително) - course_version_id (foreign_key, bigint) 10. **Course Content Translate** – ентитет кој чува податоци за различните преводи на модули за одреден курс - course_content_translate_id (primary key, bigint) - language (string, задолжително) - title(string, задолжително) - course_content_id (foreign_key, bigint) 11. **Course Lecture** – ентитет кој чува податоци за различните лекции за одреден модул на курс - course_lecture_id (primary key, bigint) - position(int, задолжително) - durationMinutes (int, задолжително) - contentType (enum {text, file, video, quiz}, задолжително) - course_content_id (foreign_key, bigint) 12. **Course Lecture Translate** – ентитет кој чува податоци за различните преведувања за лекции за одреден модул на курс - course_lecture_translate_id (primary key, bigint) - language (string, задолжително) - contentFileName (string, задолжително) - contentText (string, задолжително) - description (string, задолжително) - title (string, задолжително) - course_lecture_id (foreign_key, bigint) 13. **User Course Progress** – ентитет кој чува податоци за прогресот на корисник за лекција на одреден курс - user_course_progress_id (primary key, bigint) - isCompleted (boolean, задолжително) - completedAt (date, задолжително) - course_lecture_id (foreign_key, bigint) - enrollment_id (foreign_key, bigint) 14. **Verification Token** – ентитет кој чува податоци за токените кои се креирани за корисници да го верифицираат нивниот мејл - verification_token_uuid (primary key, uuid) - expiresAt (date, задолжително) - createdAt (date, задолжително) - user_id (foreign_key, bigint) 15. **Tag** – ентитет кој чува податоци за тагови (вештини и интереси) кои се мапираат за корисници и курсеви - tag_id (primary key, bigint) - tagType (enum {skill, topic}, задолжително) 16. ** Tag Translate** – ентитет кој чува податоци за различни преведувања за секој од таговите (вештини и интереси) - tag_translate_id (primary key, bigint) - language (enum {en, mk}, задолжително) - value (string, задолжително) - tag_id (foreign_key, bigint) 17. **User Tag** – слаб ентитет кој чува податоци за таговите (вештини и интереси) за секој корисник - tag_id (foreign_key, bigint) - user_id (foreign_key, bigint) 18. **Course Tag** – слаб ентитет кој чува податоци за таговите (вештини и интереси) за секој курс - tag_id (foreign_key, bigint) - course_id (foreign_key, bigint) ---- === Релации === 1. **has** (USER ↔ VERIFICATION_TOKEN, 1:1) Секој User има точно еден Verification_Token. Секој Verification_Token припаѓа точно на еден User. 2. **enrolls** (USER ↔ ENROLLMENT, 1:N) Еден User може да има повеќе Enrollments. Секое Enrollment припаѓа на точно еден User. 3. **has** (PAYMENT ↔ ENROLLMENT, 1:1) Секоја инстанца на Payment има точно една инстанца на Enrollment. Секоја инстанца на Enrollment може да припаѓа на точно една инстанца на Payment. 4. **has** (REVIEW ↔ ENROLLMENT, 1:1) Секоја инстанца на Review има точно една инстанца на Enrollment. Секоја инстанца на Enrollment може да припаѓа на точно една инстанца на Review. 5. **has** (ENROLLMENT ↔ COURSE_VERSION, N:1) Секоја инстанца на Enrollment има точно една инстанца на Course_Version. Една инстанца на Course_Version може да биде дел од повеќе инстанци на Enrollment. 6. **has** (COURSE ↔ COURSE_VERSION, 1:N) Една инстанца на Course може да има повеќе инстанци на Course_Version. Секоја инстанца на Course_Version припаѓа на точно една инстанца на Course. 7. **isTranslatedInto** (COURSE_VERSION ↔ COURSE, N:1) Секоја инстанца на Course_Translate припаѓа на точно една инстанца на Course. Една инстанца на Course може да има повеќе инстанци на Course_Translate. 8. **has** (COURSE_VERSION ↔ COURSE_CONTENT, 1:N) Една инстанца на CourseVersion може да има повеќе инстанци на Course_Content. Секоја инстанца на Course_Content припаѓа на точно една инстанца на CourseVersion. 9. **isTranslatedInto** (COURSE_CONTENT ↔ COURSE_CONTENT_TRANSLATE, 1:N) Една инстанца на Course_Content може да има повеќе инстанци на Course_Content_Translate. Секоја инстанца на Course_Content_Translate припаѓа на точно една инстанца на Course_Content. 10. **has** (COURSE_CONTENT ↔ COURSE_LECTURE, 1:N) Една инстанца на Course_Content може да има повеќе инстанци на Course_Lecture. Секоја инстанца на Course_Lecture припаѓа на точно една инстанца на Course_Content. 11. **isTranslatedInto** (COURSE_LECTURE ↔ COURSE_LECTURE_TRANSLATE, 1:N) Една инстанца на Course_Lecture може да има повеќе инстанци на Course_Lecture_Translate. Секоја инстанца на Course_Lecture_Translate припаѓа на точно една инстанца на Course_Lecture. 12. **has progress** (CourseLecture 1 ──< UserCourseProgress >── 1 Enrollment) Секоја инстанца на User_Course_Progress се однесува на точно една инстанца на Course_Lecture и точно една инстанца на Enrollment. Една инстанца на Course_Lecture може да биде поврзана со повеќе инстанци на User_Course_Progress. Една инстанца на Enrollment може да биде поврзана со повеќе инстанци на User_Course_Progress. 13. **has** (USER ↔ TAG, N:N) Секој User може да има повеќе TAG-ови. Секој TAG може да има повеќе User-и. 14. **has** (COURSE ↔ TAG, N:N) Секој User може да има повеќе TAG-ови. Секој TAG може да има повеќе User-и. 15. **has** (TAG ↔ TAG_TRANSLATION, 1:N) Секој TAG може да има повеќе Tag_Translation. Секој Tag_Translation припаѓа на точно на еден TAG. ----