ساعت
۹۰۱۲۳۴۵۶۷۸۹۰۹۰۱۲۳۴۵۶۷۸۹۰
ساعت
دقیقه
۹۰۱۲۳۴۵۶۷۸۹۰۹۰۱۲۳۴۵۶۷۸۹۰
دقیقه
ثانیه
۹۰۱۲۳۴۵۶۷۸۹۰۹۰۱۲۳۴۵۶۷۸۹۰
ثانیه

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

جزئیات پروژه

پروژه‌ی اولیه را از این لینک دانلود کنید. در این پروژه شما باید قسمت‌های مشخص‌شده با // 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 را که شامل تمام موارد گفته شده در بالا است آپلود کنید.


ارسال پاسخ برای این سؤال
فایلی انتخاب نشده است.