Menu
CoddyTech

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

جزء من قسم البرمجة كائنية التوجه في رحلة 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 واجعل المنشور هو البيانات (اترك Message فارغًا). حوّله إلى JSON واطبعه.

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

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

  • السطر 1: نوع العملية (json أو display)
  • السطر 2: معرّف المنشور
  • السطر 3: العنوان
  • السطر 4: المحتوى (قد يكون فارغًا)
  • السطر 5: معرّف المؤلف
  • السطر 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)

	// اقرأ معرّف المنشور
	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)

	// اقرأ معرّف المؤلف
	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 باستخدام القيم المقروءة

	// TODO: أنشئ بنية Post باستخدام القيم المقروءة وAuthor

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

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

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Go عبر الإنترنت