QCalendar


بعد از تقویم‌های جلالی، میلادی و کلندرهای مجازی که گوگل و سایر شرکت‌ها ارائه می‌دهند؛ ما در کوئرا به فکر طراحی تقویم خودمان افتاده‌ایم. و وظیفه‌ی آن به اون یکی همکارمون در شرکت محول شده. از شما می‌خواهیم این پروژه را طبق معمول کوئرا برای اون یکی همکارمون پیاده‌سازی کنید.

جزئیات پروژه🔗

پروژه‌ی اولیه را از این لینک دانلود کنید. در این پروژه شما باید قسمت‌های مشخص‌شده با // TODO را پیاده‌سازی کنید.

جداول🔗

ساختار structهایی که جداول شما رو میسازند باید به شکل زیر باشد:

1- User

نام ستون نوع ملاحظات
gorm.Model struct PRIMARY KEY AUTO_INCREMENT
Username string نام کاربری
FirstName string نام
LastName string نام خانوادگی

2- Calendar

نام ستون نوع ملاحظات
gorm.Model struct PRIMARY KEY AUTO_INCREMENT
Name string نام تقویم
UserID uint کلید خارجی به جدول users و ستون id

3- Appointment

نام ستون نوع ملاحظات
gorm.Model struct PRIMARY KEY AUTO_INCREMENT
Subject string موضوع ملاقات
Description string توضیحات ملاقات
StartTime time.Time زمان شروع ملاقات
Length uint مدت زمان ملاقات
OwnerID uint آیدی دارنده ملاقات
OwnerType string تایپ کلاس دارنده ملاقات

4- TaskList

نام ستون نوع ملاحظات
gorm.Model struct PRIMARY KEY AUTO_INCREMENT

جهت اطلاعات بیشتر در مورد gorm.Model می‌توانید به این لینک مراجعه نمایید.

روابط🔗

در ادامه شما باید به پیاده‌سازی روابط بین مدل‌ها بپردازید که ارتباطات بین مدل‌ها باید به‌صورت زیر باشد:

  • هر کاربر یک تقویم دارد و هر تقویم متعلق به یک کاربر است.
  • هر کاربر می‌تواند چند وقت‌ملاقات داشته باشد و هر وقت‌ملاقات هم می‌تواند چند کاربر داشته باشد.(از طریق جدول appointment_user)
  • هر تقویم می‌تواند چند وقت‌ملاقات داشته باشد.
  • هر فهرست‌وظیفه می‌تواند چند وقت‌ملاقات داشته باشد.
  • هر وقت‌ملاقات متعلق به یک تقویم یا فهرست‌وظیفه است.

توابع🔗

شما باید بدنه توابع زیر را به شکلی مطلوب تکمیل نمایید.

تابع RefreshDatabase🔗

این تابع با دریافت آبجکتی از نوع *gorm.DB و لیستی از جداول، ابتدا باید آن‌ها را حذف کند و سپس آن‌ها را طبق آخرین تغییرات بر اساس استراکت‌های مربوطه بسازد. در صورت موفقیت‌آمیز بودن عملیات باید Refresh database successfully done به عنوان رشته برگردانده شود به همره nil و اگر خطایی در طی فرآیند رخ داد باید رشته خالی به همراه ارور مربوطه برگردانده شود. امضای تابع به شکل زیر است:

func RefreshDatabase(db *gorm.DB, tables []interface{}) (string, error){
    // TODO: Implement
}
Go

تابع SeedUser🔗

این تابع باید به صورت Seeder عمل کند و با دریافت پارامترهای لازم یک کاربر با تقویم و لیست ملاقات‌های مربوطه بسازد و در جدول ذخیره کند و در صورت موفقیت‌آمیز بودن عملیات پیام Seeding database successfully done را چاپ کند و در غیر این صورت ارور را به همراه یک رشته خالی برگرداند. امضای تابع به شکل زیر است:

func SeedUser(db *gorm.DB, username, firstName, lastName, calendarName, appointmentSubject string, startDate time.Time) (string, error) {
    // TODO: Implement
}
Go

تابع updateAppointment🔗

این تابع باید به تمام وقت‌ملاقات‌هایی که اسم تقویم آن‌ها برابر با calendarName، زمان شروع آنها بین startTime و endTime و موضوع رویداد، شامل keyword باشد یک ساعت به زمان شروع ملاقات‌ها اضافه کند و به انتهای توضیحات آن‌ها هم event (یک فاصله و بعد event) را اضافه کند و در جدول ذخیره نماید در غیر این صورت ارور مربوطه را برگرداند. امضای تابع به شکل زیر است:

func updateAppointment(db *gorm.DB, calendarName string, startTime time.Time, endTime time.Time, keyword string) error {
    // TODO: Implement
}
Go

اسکوپ UserWithRangeAppointment🔗

این اسکوپ باید تمام کاربرانی که زمان شروع ملاقات آن‌ها بین startDate و endDate است، موضوع ملاقات آن‌ها برابر subject است و اسم تقویم آن‌ها برابر calendarTableName را برگرداند. امضای اسکوپ به شکل زیر است:

func UserWithRangeAppointment(startDate, endDate time.Time, subject string, calendarTableName string) func(db *gorm.DB) *gorm.DB {
    // TODO: Implement
}
Go

نکات🔗

  • دقت کنید که قسمت‌های مختلف سوال با هم مرتبط هستند و در صورت صحیح نبودن جداول و روابط بین آن‌ها ممکن است تست‌های بعدی هم پاس نشوند!
  • شما در این سوال باید از GORM و امکانات آن استفاده کنید.
  • فایل db.go جهت اتصال GORM با دیتابیس است که در آن از دیزان‌پترن singleton استفاده شده و شما نیازی به تغییر آن ندارید و صرفا ثابت‌های آن را جهت اجرا در محیط لوکال خود می‌توانید تغییر دهید. فرض کنید سمت سرور نیز این فایل به درستی و مطابق دیتابیس سرور وجود دارد.

آن‌چه باید آپلود کنید🔗

پس از پیاده‌سازی موارد خواسته شده، فایل main.go را که شامل تمام موارد گفته شده در بالا است آپلود کنید.