สถาปัตยกรรม
สถาปัตยกรรมการจัดการกับ schema-type directives

การจัดการกับ schema-type directives

Gato GraphQL เป็น code-first server กล่าวคือ ใช้โค้ดในการพัฒนา schema (อีกแนวทางหนึ่งคือ SDL-first ซึ่งใช้ Schema Definition Language เพื่อสร้าง schema ก่อน แล้วจึงพัฒนา service)

เนื่องจาก code-first server ไม่มี SDL จึงไม่สามารถรองรับ schema-type directives ได้โดยธรรมชาติ เพื่อหลีกเลี่ยงข้อจำกัดนี้ Gato GraphQL จึงได้พัฒนากลไกดังต่อไปนี้:

ส่งผลให้ GraphQL server รองรับ schema-type directives ได้อย่างสมบูรณ์

เหตุใดจึงทำงานได้?

@deprecated เป็น schema-type directive จึงต้องถูกนำไปใช้งานบน schema อย่างไรก็ตาม จะเกิดอะไรขึ้นหากเราสมมติชั่วคราวว่ามันเป็น query-type directive และเพิ่ม @deprecated ลงในบาง field โดยตรงใน query?

ตัวอย่างเช่น เมื่อ execute query นี้:

query {
  posts {
    id
    title
    content @deprecated(reason: "Use newContent instead")
  }
}

มันก็ยังสามารถทำงานได้! เพราะท้ายที่สุดแล้ว directive ก็เป็นเพียงฟังก์ชันที่ execute บน field การประกาศฟังก์ชันนั้นผ่าน schema หรือโดยตรงใน query ไม่ได้ทำให้พฤติกรรมของฟังก์ชันเปลี่ยนแปลงไปแต่อย่างใด

แม้ว่ามันจะทำงานได้ แต่ก็ไม่มีความหมายที่สมเหตุสมผล เราไม่สามารถบังคับให้ client เพิ่ม @deprecated ลงใน queries ของตนเองได้ นี่คือฟังก์ชันที่ application ฝั่ง server เป็นผู้ตัดสินใจ ไม่ใช่ฝั่ง client

อย่างไรก็ตาม ฟังก์ชันนั้นเองยังคงทำงานได้ ดังนั้น การเพิ่ม directive ลงใน schema หรือใน query จึงไม่มีความสำคัญจากมุมมองเชิงฟังก์ชัน ยิ่งไปกว่านั้น ทุก directive จะถูก execute ใน query อยู่เสมอ เพราะนั่นคือสถานที่ที่มันถูก execute

ดังนั้น หาก server ไม่มี SDL ก็ยังสามารถฝัง directive เข้าไปใน query ได้ในช่วง runtime