Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

مراجعة - نماذج REST API

جزء من قسم Object Oriented Programming في رحلة GO على Coddy — الدرس 78 من 107.

challenge icon

التحدي

سهل

لنقم ببناء نظام نماذج REST API لمنصة مدونة! ستقوم بإنشاء أنواع منظمة بشكل جيد يتم تسلسلها إلى JSON وتوفر تمثيلات نصية مقروءة — تماماً كما ستحتاج عند بناء استجابات API حقيقية.

ستقوم بتنظيم الكود الخاص بك عبر ملفين:

  • models.go: قم بتعريف نماذج بيانات API الخاصة بك مع وسوم JSON المناسبة والتمثيلات النصية.

    أنشئ هيكل Author مع حقول ID (int)، و Name (string)، و Email (string). قم بربط هذه الحقول بمفاتيح JSON وهي "id"، و "name"، و "email". قم بتنفيذ String() لتعيد التنسيق [Name] <[Email]>.

    أنشئ هيكل Post مع حقول ID (int)، و Title (string)، و Content (string)، و Author (هيكل Author متداخل)، و Published (bool). قم بربط هذه الحقول بـ "id"، و "title"، و "content"، و "author"، و "published". يجب أن يستخدم حقل Content الخاصية omitempty بحيث لا يظهر المحتوى الفارغ في JSON. قم بتنفيذ String() لتعيد "[Title]" by [Author's String representation].

    أنشئ هيكل APIResponse مع حقول Success (bool)، و Message (string)، و Data (Post). قم بربطها بـ "success"، و "message"، و "data". يجب أن يستخدم حقل Message الخاصية omitempty.

  • main.go: قم ببناء استجابات API واستعرض كلاً من مخرجات JSON والتمثيلات النصية.

    اقرأ نوع العملية (json أو display)، ثم اقرأ تفاصيل المنشور: معرف المنشور، العنوان، المحتوى، معرف الكاتب، اسم الكاتب، بريد الكاتب الإلكتروني، وحالة النشر (true أو false).

    بالنسبة لـ json: أنشئ APIResponse مع Success: true والمنشور (Post) كبيانات (اترك Message فارغاً). قم بتحويله إلى JSON واطبعه.

    بالنسبة لـ display: أنشئ المنشور (Post) واطبعه باستخدام تابع String الخاص به، ثم اطبع الكاتب (Author) بشكل منفصل في سطر جديد.

سيتم توفير المدخلات التالية:

  • السطر 1: نوع العملية (json أو display)
  • السطر 2: معرف المنشور (Post ID)
  • السطر 3: العنوان
  • السطر 4: المحتوى (قد يكون فارغاً)
  • السطر 5: معرف الكاتب (Author ID)
  • السطر 6: اسم الكاتب
  • السطر 7: بريد الكاتب الإلكتروني
  • السطر 8: حالة النشر (true أو false)

على سبيل المثال، إذا أعطينا:

json
1
Getting Started with Go
Learn the basics of Go programming
101
Jane Smith
jane@example.com
true

يجب أن تكون مخرجاتك:

{"success":true,"data":{"id":1,"title":"Getting Started with Go","content":"Learn the basics of Go programming","author":{"id":101,"name":"Jane Smith","email":"jane@example.com"},"published":true}}

وإذا أعطينا:

json
2
Draft Post

102
John Doe
john@example.com
false

يجب أن تكون مخرجاتك:

{"success":true,"data":{"id":2,"title":"Draft Post","author":{"id":102,"name":"John Doe","email":"john@example.com"},"published":false}}

لاحظ كيف تم حذف حقل المحتوى الفارغ من مخرجات JSON.

وإذا أعطينا:

display
3
Advanced Interfaces
Deep dive into Go interfaces
103
Alice Chen
alice@example.com
true

يجب أن تكون مخرجاتك:

"Advanced Interfaces" by Alice Chen <alice@example.com>
Alice Chen <alice@example.com>

جرّب بنفسك

package main

import (
	"bufio"
	"encoding/json"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	reader := bufio.NewReader(os.Stdin)

	// قراءة نوع العملية
	operation, _ := reader.ReadString('\n')
	operation = strings.TrimSpace(operation)

	// قراءة post ID
	postIDStr, _ := reader.ReadString('\n')
	postID, _ := strconv.Atoi(strings.TrimSpace(postIDStr))

	// قراءة العنوان
	title, _ := reader.ReadString('\n')
	title = strings.TrimSpace(title)

	// قراءة المحتوى
	content, _ := reader.ReadString('\n')
	content = strings.TrimSpace(content)

	// قراءة author ID
	authorIDStr, _ := reader.ReadString('\n')
	authorID, _ := strconv.Atoi(strings.TrimSpace(authorIDStr))

	// قراءة اسم الكاتب
	authorName, _ := reader.ReadString('\n')
	authorName = strings.TrimSpace(authorName)

	// قراءة البريد الإلكتروني للكاتب
	authorEmail, _ := reader.ReadString('\n')
	authorEmail = strings.TrimSpace(authorEmail)

	// قراءة حالة النشر
	publishedStr, _ := reader.ReadString('\n')
	published := strings.TrimSpace(publishedStr) == "true"

	// TODO: إنشاء Author struct بالقيم المقروءة

	// TODO: إنشاء Post struct بالقيم المقروءة والـ Author

	// TODO: التعامل مع نوع العملية
	// إذا كانت العملية "json":
	//   - إنشاء APIResponse مع Success: true والـ Post كـ Data
	//   - التحويل إلى JSON باستخدام json.Marshal
	//   - طباعة نص الـ JSON
	// إذا كانت العملية "display":
	//   - طباعة الـ Post باستخدام طريقة String الخاصة به
	//   - طباعة الـ Author في سطر جديد

	// مكان محجوز لاستخدام المتغيرات (يُحذف عند التنفيذ)
	_ = postID
	_ = title
	_ = content
	_ = authorID
	_ = authorName
	_ = authorEmail
	_ = published
	_ = operation
	_ = json.Marshal
	fmt.Println("TODO: Implement the solution")
}

جميع دروس Object Oriented Programming