#import "@local/nure:0.1.0": *

#import calc: max
#import table: cell

#show: pz-lb.with(..yaml("doc.yaml"))
#set text(size: 14pt)

#let map-column(items, min-height, column) = {
  return for i in range(0, min-height) {
    (items.at(i, default: ""),)
  }.map(e => cell(x: column)[_ #e _])
}

#let crc-card(
  name: "Name",
  subclasses: (),
  superclasses: (),
  responsibilities: ("responsibilities",),
  collaborators: (),
  description: "description",
  attributes: ("attributes",),
) = figure(
  table(
    align: left, column-gutter: (0cm, 0.5cm), columns: (3fr, 2fr, 4fr),

    cell(x: 0, y: 0, colspan: 2)[_ #name _],
    cell(x: 0, y: 1, colspan: 2)[subclasses: _ #subclasses.join(", ") _],
    cell(x: 0, y: 2, colspan: 2)[superclasses: _ #superclasses.join(", ") _],

    table.cell(x: 0, y: 3)[responsibilities],
    ..map-column(responsibilities, 5, 0),

    cell(x: 1, y: 3)[collaborators],
    ..map-column(collaborators, 5, 1),

    cell(x: 2, y: 0)[_ #name _],
    cell(x: 2, y: 1)[#linebreak()],
    cell(x: 2, y: 2)[Description:],
    cell(x: 2, y: 3)[_ #description _],

    cell(x: 2, y: 4)[Attributes:],
    ..map-column(attributes, 4, 2),
  ),
)

#let crc-cards = (
  // User
  (
    name: "User",
    description: "Represents a platform user with authentication, profile management, and subscription capabilities",
    attributes: (
      "email",
      "username",
      "password",
      "profileInfo",
      "subscriptionTier",
    ),
    subclasses: (),
    superclasses: (),
    responsibilities: (
      "Authenticate user credentials",
      "Manage user profile information",
      "Track subscription status and limits",
      "Maintain user activity history",
      "Handle user preferences and settings",
    ),
    collaborators: (
      "Task",
      "Solution",
      "Attachment",
      "Payment",
      "Subscription",
    ),
  ),
  // Task
  (
    name: "Task",
    description: "Core entity representing a task with description, attachments, access controls, and monetization options",
    attributes: (
      "title",
      "owner",
      "tags",
      "attachments",
      "accessType",
      "price",
    ),
    subclasses: (),
    superclasses: (),
    responsibilities: (
      "Store task information and metadata",
      "Manage task access permissions",
      "Handle task pricing and monetization",
      "Track task completion status",
      "Maintain task versioning and history",
      "Support task cloning/forking",
      "Manage attached files and resources",
    ),
    collaborators: (
      "User",
      "Solution",
      "TaskGroup",
      "Comment",
      "Payment",
      "Attachment",
    ),
  ),
  // Attachment
  (
    name: "Attachment",
    description: "Manages attachments for tasks and solutions with storage limits and security controls",
    attributes: (
      "creator",
      "target",
      "type",
      "data",
    ),
    subclasses: (),
    superclasses: (),
    responsibilities: (
      "Enforce storage limits per subscription tier",
      "Handle file upload and download",
      "Support multiple formats",
      "Generate secure URLs",
    ),
    collaborators: (
      "Task",
      "Solution",
      "User",
      "Subscription",
    ),
  ),
  // Solution
  (
    name: "Solution",
    description: "Represents user-submitted solutions to tasks with various formats and evaluation capabilities",
    attributes: (
      "task",
      "owner",
      "content",
      "attachments",
      "status",
      "rating",
      "isPublic",
    ),
    subclasses: (),
    superclasses: (),
    responsibilities: (
      "Store solution content and attachments",
      "Track solution submission status",
      "Handle solution evaluation and rating",
      "Manage solution visibility settings",
      "Support various solution formats",
      "Maintain solution history",
    ),
    collaborators: (
      "User",
      "Task",
      "Comment",
      "Rating",
      "Attachment",
    ),
  ),
  // TaskGroup
  (
    name: "TaskGroup",
    description: "Organizes related tasks into thematic or project-based collections with shared access settings",
    attributes: (
      "name",
      "description",
      "owner",
      "tasks",
      "accessType",
      "price",
    ),
    subclasses: (),
    superclasses: (),
    responsibilities: (
      "Group related tasks together",
      "Manage group-level access permissions",
      "Handle group monetization settings",
      "Integrate with GitHub repositories",
      "Support bulk operations on tasks",
      "Maintain group metadata",
    ),
    collaborators: (
      "Task",
      "User",
      "Payment",
    ),
  ),
  // Comment
  (
    name: "Comment",
    description: "Enables user interaction through comments on tasks with rating capabilities",
    attributes: (
      "user",
      "target",
      "content",
    ),
    subclasses: (),
    superclasses: (),
    responsibilities: (
      "Store comment content and metadata",
      "Track comment timestamps",
      "Handle comment moderation",
    ),
    collaborators: (
      "User",
      "Task",
      "Solution",
    ),
  ),
  // Payment
  (
    name: "Payment",
    description: "Handles financial transactions for task access, solutions, and subscriptions",
    attributes: (
      "user",
      "target",
      "amount",
      "currency",
      "status",
      "paymentMethod",
    ),
    subclasses: (),
    superclasses: (),
    responsibilities: (
      "Process payment transactions",
      "Validate payment information",
      "Handle payment failures and retries",
      "Track payment history",
      "Integrate with payment providers",
      "Manage refunds and chargebacks",
    ),
    collaborators: (
      "User",
      "Task",
      "TaskGroup",
      "Subscription",
    ),
  ),
  // Subscription
  (
    name: "Subscription",
    description: "Manages user subscription tiers, limits, and billing cycles",
    attributes: (
      "user",
      "tier",
      "startDate",
      "endDate",
      "status",
      "taskLimit",
      "storageLimit",
      "price",
      "billingCycle",
    ),
    subclasses: (),
    superclasses: (),
    responsibilities: (
      "Manage subscription lifecycle",
      "Enforce subscription limits",
      "Handle subscription upgrades/downgrades",
      "Track usage against limits",
      "Process subscription renewals",
    ),
    collaborators: (
      "User",
      "Payment",
    ),
  ),
)


#v(-spacing)
== Мета роботи
Отримати навички побудови статичного представлення логічної моделі
проектованої інформаційної системи у вигляді CRC-карток, об'єктної моделі,
діаграми класів UML.

== Хід роботи
#v(-spacing)
=== Створення Smart Use Case діаграми
SMART Use Case Diagram це один з інструментів моделювання в UML, що візуально відображає функціональні вимоги до системи з точки зору користувача. Вона складається з акторів, варіантів використання та зв'язків між ними, демонструючи, хто і як використовує систему для досягнення певних цілей. Ця діаграма допомагає розробникам, замовникам та іншим зацікавленим сторонам краще зрозуміти обсяг та призначення системи, сприяючи ефективній комунікації та збору вимог на ранніх етапах розробки програмного забезпечення.
#figure(image("uml/uc.svg"), caption: [SMART Use Case діаграма])

=== Проєктування системи методом мозкового штурму (CRC-картки)
CRC-картки це інструмент для об'єктно-орієнтованого дизайну, що використовується переважно на початкових етапах розробки програмного забезпечення. Вони допомагають команді швидко обговорювати та визначати, які класи потрібні системі, за що відповідає кожен клас, і з якими іншими класами він взаємодіє для виконання своїх завдань.

Під час мозкового штурму нами було виділено картки із наступними класами:
#crc-cards.map(e => e.name).join(", ");

#crc-cards.map(e => crc-card(..e)).join(line(length: 100%, stroke: 1pt + gray));

=== Створення діаграми класів
Діаграма класів показує класи, їхні атрибути та операції а також зв'язки між ними. Це основна діаграма, що визначає архітектуру системи та взаємодію її компонентів.
#figure(image("uml/class.svg"), caption: [Діаграма класів])

=== Створення діаграми об'єктів
Діаграма об'єктів є миттєвим станом системи в конкретний момент часу, що демонструє конкретні екземпляри класів (об'єкти) та їхні зв'язки. На відміну від діаграми класів, яка показує загальну структуру та можливі зв'язки, діаграма об'єктів відображає реальні об'єкти з їхніми поточними значеннями атрибутів і фактичними зв'язками між ними. Вона використовується для візуалізації конкретних сценаріїв виконання та допомагає перевірити правильність діаграми класів.
#figure(image("uml/object.svg"), caption: [Діаграма об'єктів])

== Висновки
За результатами цієї лабораторної роботи ми отримали навички побудови статичного представлення логічної моделі
проектованої інформаційної системи у вигляді CRC-карток, об'єктної моделі та діаграми класів UML.
