Skip to main content

SKOLE-DIRY — Digital Diary Module

Module ID: SKOLE-DIRY | Version: 1.0 | Status: Active
Products: Parent App (read/status update) · Teacher App (create/manage) · Web App (view)

1. Overview

FieldValue
Module NameDigital Diary
Module CodeDIRY
Business ValueReplaces physical homework diaries. Teachers post assignments with due dates, priority levels, and attachments. Parents view and mark homework as completed, keeping both sides aligned on academic tasks.

Scope In

  • Teachers: Create, edit, delete diary entries (homework, classwork, notes, reminders)
  • Parents: View diary entries for their child, mark as completed
  • Filtering by grade, student, diary type, status

Scope Out

  • File upload (attachment_url stored but upload handled externally)
  • Student self-service diary access

2. Requirements

Functional Requirements (FR)

What the module must DO — actions, behaviors, and outcomes.
  • SKOLE-DIRY-FR001: The module shall allow teachers to create diary entries with title, description, grade, type (homework, classwork, note, reminder), due date, priority, and optional attachment URLs.
  • SKOLE-DIRY-FR002: The module shall allow targeting diary entries to either an entire grade or a specific student.
  • SKOLE-DIRY-FR003: The module shall enable teachers to update and soft-delete diary entries.
  • SKOLE-DIRY-FR004: The module shall allows parents to view all relevant diary entries for their child’s grade or student ID.
  • SKOLE-DIRY-FR005: The module shall allow parents to mark a diary entry as ‘completed’ for their child.
  • SKOLE-DIRY-FR006: The module shall support priority levels: low, medium, and high.
  • SKOLE-DIRY-FR007: The module shall allows web admins to view all diary activities across the school.

Non-Functional Requirements (NFR)

How well the module must do it — performance, security, and reliability.
  • SKOLE-DIRY-NFR001: The module shall behave reliably by ensuring soft-deleted entries (deleted_status = 1) never appear in consumer API responses.
  • SKOLE-DIRY-NFR002: The module shall perform visual highlighting for overdue pending tasks in the parent application.
  • SKOLE-DIRY-NFR003: The module shall ensure that diary entries are delivered to parents with minimal latency after being published by a teacher.

Constraints

Rules and boundaries — tech choices and platform restrictions.
  • C001: We must implement soft-deletion using a deleted_status flag because the platform architecture avoids permanent data removal for audit purposes.
  • C002: We must use external file storage for attachments as the platform does not currently host raw binary assets for diary entries.

3. Sub-modules / Backlog

IDSub-modulePriorityStatusEstimateLinked FR
SKOLE-DIRY-SM001Teacher diary management (CRUD)P0Done3dFR001–FR003
SKOLE-DIRY-SM002Parent diary viewerP0Done2dFR004–FR005
SKOLE-DIRY-SM003Web admin diary viewP1Done1dFR008
SKOLE-DIRY-SM004File attachment supportP2PartialFR001

4. Logical Implementation

Entry Lifecycle State Machine

[draft] ──publish──→ [published] ──parent marks done──→ [completed]
[published] ──teacher edits──→ [published]
[published] ──teacher deletes──→ [deleted] (deleted_status = 1, hidden)

Teacher Create Flow

POST /teachers-app/digital-diary
  ├─ Input: { skole_id, staff_id, grade, diary_type, title, description,
  │           due_date, priority, status, attachment_url, student_id? }
  └─ Insert into digital_diary → return created entry

Parent View Flow

GET /parent-app/digital-diary?grade=&student_id=&diary_type=&status=
  ├─ JWT → extract skole_id
  ├─ Filter: WHERE skole_id = jwt.skole_id AND deleted_status = 0
  │          AND (grade = ? OR student_id = ?) 
  └─ Return entries sorted by due_date ASC

Parent Status Update Flow

PUT /parent-app/digital-diary/:id
  ├─ Input: { status: 'completed' }
  └─ Update digital_diary SET status = 'completed' WHERE id = :id

Error Handling

ScenarioHTTPMessage
Entry not found404”Diary entry not found”
Invalid diary_type400Validation error
Soft-deleted entry404”Not found” (filtered at query level)

5. UI Requirements

Parent App — DiaryScreen

IDScreenRouteDescription
SKOLE-DIRY-UI001DiaryScreen/diaryFiltered list of diary entries grouped by due date with status indicators
Components:
IDComponentProps
SKOLE-DIRY-UC001DiaryCardentry, onMarkComplete, isOverdue
SKOLE-DIRY-UC002DiaryTypeFiltertypes[], selected, onChange
SKOLE-DIRY-UC003PriorityBadge`priority: lowmediumhigh`
SKOLE-DIRY-UC004DueDateChipdue_date, isOverdue
SKOLE-DIRY-UC005AttachmentLinkurl
UI States:
  • Loading: 3 skeleton cards
  • Empty: “No diary entries for this period”
  • Error: Toast + retry button

Teacher App — DiaryScreen

IDScreenRouteDescription
SKOLE-DIRY-UI002DiaryScreen/diaryFull CRUD interface for managing diary entries, with grade/student selectors
Additional Components:
IDComponentProps
SKOLE-DIRY-UC006DiaryForminitialValues, onSubmit, loading
SKOLE-DIRY-UC007GradeStudentPickergrades[], students[], onSelect
SKOLE-DIRY-UC008DeleteConfirmModalonConfirm, onCancel

Web App — Diary Page

IDScreenRouteDescription
SKOLE-DIRY-UI003Diary Page/:skoleId/diaryRead-only tabular view with filters for grade, type, date range

6. Conditional Expressions

IDExpressionTriggerTrue ActionFalse Action
SKOLE-DIRY-CE001entry.deleted_status === 1DB queryExclude from resultsInclude
SKOLE-DIRY-CE002entry.due_date < today && entry.status !== 'completed'DiaryCard renderShow overdue badge (red)Normal style
SKOLE-DIRY-CE003entry.status === 'completed'DiaryCard renderShow checkmark, grey outShow pending style
SKOLE-DIRY-CE004entry.priority === 'high'DiaryCard renderRed PriorityBadgeNormal badge color
SKOLE-DIRY-CE005entry.student_id !== nullTeacher query filterTarget specific studentTarget whole grade
SKOLE-DIRY-CE006entry.attachment_url !== nullDiaryCard renderShow attachment linkHide attachment section
SKOLE-DIRY-CE007user.type === 'staff'Diary screen renderShow edit/delete controlsHide teacher-only actions

7. Internal Module Connections

DirectionModuleData / EventCondition
DIRY → AUTHAuthJWT skole_id scopes all queriesEvery request
DIRY → STUDStudentsstudent_id links entry to a specific studentWhen student-specific entry
ENGG → DIRYEngagementComments and reactions attach to diary entries via entity_type='diary'On comment/react action
DASH → DIRYDashboardPending diary count shown on parent dashboardDashboard load

8. External Connections

IDServicePurposeFailure Behavior
SKOLE-DIRY-EX001PostgreSQL (Prisma)Read/write digital_diary500 error
SKOLE-DIRY-EX002File Storage (URL-based)attachment_url links to external file hostBroken link shown to user

9. Database Tables

IDTableRole
SKOLE-DIRY-TB001digital_diaryAll diary entries

digital_diary Schema

ColumnTypeNotes
idInt PKAuto-increment
skole_idVarChar(15)School tenant key
staff_idIntTeacher who created it
gradeVarChar(50)Target grade
student_idInt?Specific student (optional)
diary_typeVarChar(50)homework/classwork/note/reminder
titleVarChar(255)Entry title
descriptionTextFull entry content
due_dateDateCompletion deadline
attachment_urlVarChar(500)External file link
priorityVarChar(25)low/medium/high
statusVarChar(25)pending/completed
deleted_statusInt0=active, 1=deleted
created_atTimestamp
updated_atTimestamp

10. API Endpoints Summary

IDMethodRouteAuthDescription
PARENT-01GET/parent-app/digital-diaryJWTList child’s diary entries
PARENT-02GET/parent-app/digital-diary/:idJWTRead single entry
PARENT-03PUT/parent-app/digital-diary/:idJWTMark entry completed
PARENT-04POST/parent-app/digital-diary/:id/attachmentsJWTUpload attachment
TEACH-01GET/teachers-app/digital-diaryJWTList all entries
TEACH-02GET/teachers-app/digital-diary/:idJWTRead entry detail
TEACH-03POST/teachers-app/digital-diaryJWTCreate entry
TEACH-04PUT/teachers-app/digital-diary/:idJWTUpdate entry
TEACH-05DELETE/teachers-app/digital-diary/:idJWTDelete entry
ADMIN-01GET/web-app/digital-diaryJWTList all entries
ADMIN-02GET/web-app/digital-diary/:idJWTView entry detail
ADMIN-03POST/web-app/digital-diaryJWTCreate entry

  • Default sort: by due_date ascending

PARENT-01: List Child’s Diary Entries

Section 1: Endpoint Summary

Returns all diary entries visible to parent for their child, including homework, classwork notes, and reminders. Filters by priority, type, and status.

Section 2: HTTP Details

  • HTTP Method: GET
  • Endpoint URL: /parent-app/digital-diary
  • Authentication: JWT Bearer Token (Parent)
  • Rate Limit: 100 requests per minute

Section 4: Query Parameters

ParameterTypeRequiredDefaultDescription
diary_typeStringNo-Filter: homework, classwork, note, reminder
statusStringNopendingFilter: pending, completed
priorityStringNo-Filter: low, medium, high
from_dateDateNo30 days agoStart date
to_dateDateNoTodayEnd date
takeIntegerNo20Page size
skipIntegerNo0Offset

Section 6: Response Schema (Success - 200)

{
  "status": "success",
  "data": {
    "entries": [
      {
        "id": "UUID",
        "title": "Math Chapter 5 Homework",
        "description": "Complete exercises 1-20 from page 45",
        "diary_type": "homework",
        "priority": "high",
        "status": "pending",
        "due_date": "2026-03-18",
        "created_by": "Mr. Vikram Kumar",
        "created_at": "2026-03-16T10:00:00.000Z",
        "attachment_url": "https://cdn.skole.com/diary/pdf123.pdf"
      }
    ],
    "pagination": {
      "total": 12,
      "take": 20,
      "skip": 0
    }
  }
}

Section 7: Error Responses

401 - Unauthorized
{
  "status": "error",
  "code": "UNAUTHORIZED",
  "message": "Invalid JWT token"
}
404 - No Entries
{
  "status": "success",
  "data": {
    "entries": [],
    "pagination": {"total": 0}
  }
}

Section 8: Implementation Examples

JavaScript:
const getChildDiary = async (token, filters = {}) => {
  const params = new URLSearchParams({
    status: 'pending',
    take: 20,
    ...filters
  });

  const response = await fetch(
    `https://api.skole.com/v1/parent-app/digital-diary?${params}`,
    {
      method: 'GET',
      headers: { 'Authorization': `Bearer ${token}` }
    }
  );

  const data = await response.json();
  return data.data.entries;
};

// Usage
const homeworks = await getChildDiary(token, { diary_type: 'homework' });
Python:
def get_child_diary(token: str, diary_type: str = None) -> list:
    url = 'https://api.skole.com/v1/parent-app/digital-diary'
    headers = {'Authorization': f'Bearer {token}'}
    
    params = {
        'status': 'pending',
        'take': 20
    }
    if diary_type:
        params['diary_type'] = diary_type
    
    response = requests.get(url, headers=headers, params=params)
    data = response.json()
    return data['data']['entries']

Section 9: Database Context

Tables:
  • digital_diary (primary)
  • students (join for access control)
Query:
SELECT dd.* FROM digital_diary dd
JOIN students s ON s.grade = dd.grade
WHERE s.parent_id = ? AND s.skole_id = ? 
  AND dd.deleted_status = 0
  AND dd.due_date >= ? AND dd.due_date <= ?
ORDER BY dd.due_date ASC
Indices: (skole_id, grade), (skole_id, deleted_status), due_date

Section 10: Business Logic & Validations

Filtering:
  • Automatically hides deleted entries (deleted_status = 1)
  • Scopes to parent’s school and child’s grade
  • Respects privacy: parents see only entries for their child’s grade/student
  • Default sort: by due_date ascending
  • GET /parent-app/digital-diary/:id - Single entry detail
  • PUT /parent-app/digital-diary/:id - Mark completed
  • POST /parent-app/digital-diary/:id/attachments - Upload file

Section 12: Response Summary Table

StatusScenarioError CodeMessage
200 ✅Success-Entries retrieved
401 ❌UnauthorizedUNAUTHORIZEDInvalid token

PARENT-02: Get Diary Entry Detail

Section 1: Endpoint Summary

Fetch complete details of a single diary entry including full description, attachments, and completion status.

Section 2: HTTP Details

  • HTTP Method: GET
  • Endpoint URL: /parent-app/digital-diary/:id
  • Authentication: JWT (Parent)

Section 3: Path Parameters

ParameterTypeRequiredDescription
idUUIDYesEntry ID

Section 6: Response Schema (Success - 200)

{
  "status": "success",
  "data": {
    "id": "UUID",
    "title": "Science Project Submission",
    "description": "Submit solar system project with at least 5 planets",
    "diary_type": "homework",
    "priority": "high",
    "due_date": "2026-03-20",
    "status": "pending",
    "created_by": "Dr. Anjali Sharma",
    "attachment_url": "https://cdn.skole.com/diary/project-guide.pdf",
    "created_at": "2026-03-16T10:00:00.000Z"
  }
}

Section 8: Implementation Examples

JavaScript:
const getDiaryEntry = async (token, entryId) => {
  const response = await fetch(
    `https://api.skole.com/v1/parent-app/digital-diary/${entryId}`,
    {
      method: 'GET',
      headers: { 'Authorization': `Bearer ${token}` }
    }
  );

  return (await response.json()).data;
};

Section 12: Response Summary Table

StatusScenarioError Code
200 ✅Success-
404 ❌Not foundNOT_FOUND

PARENT-03: Mark Entry Completed

Section 1: Endpoint Summary

Parent marks a diary entry as completed for their child, updating status to reflect completion.

Section 2: HTTP Details

  • HTTP Method: PUT
  • Endpoint URL: /parent-app/digital-diary/:id
  • Authentication: JWT (Parent)

Section 5: Request Body Schema

{
  "status*": "Enum: pending, completed"
}

Section 6: Response Schema (Success - 200)

{
  "status": "success",
  "message": "Entry marked as completed",
  "data": {
    "id": "UUID",
    "status": "completed",
    "completed_at": "2026-03-18T15:30:00.000Z"
  }
}

Section 8: Implementation Examples

JavaScript:
const markDiaryComplete = async (token, entryId) => {
  const response = await fetch(
    `https://api.skole.com/v1/parent-app/digital-diary/${entryId}`,
    {
      method: 'PUT',
      headers: {
        'Authorization': `Bearer ${token}`,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({ status: 'completed' })
    }
  );

  return (await response.json()).status === 'success';
};

Section 12: Response Summary Table

StatusScenarioError Code
200 ✅Success-

PARENT-04: Upload Attachment

Section 1: Endpoint Summary

Allows parents to attach files (completion proof, photos) to diary entries.

Section 2: HTTP Details

  • HTTP Method: POST
  • Endpoint URL: /parent-app/digital-diary/:id/attachments
  • Content-Type: multipart/form-data
  • Authentication: JWT (Parent)

Section 5: Request Body Schema

Form Data:
- file: File (max 10MB, types: jpg, png, pdf, doc)
- description: String (optional)

Section 6: Response Schema (Success - 201)

{
  "status": "success",
  "message": "Attachment uploaded",
  "data": {
    "url": "https://cdn.skole.com/diary/attachments/file123.pdf",
    "filename": "project-proof.pdf",
    "size": 2048576
  }
}

Section 8: Implementation Examples

JavaScript:
const uploadDiaryAttachment = async (token, entryId, file) => {
  const formData = new FormData();
  formData.append('file', file);

  const response = await fetch(
    `https://api.skole.com/v1/parent-app/digital-diary/${entryId}/attachments`,
    {
      method: 'POST',
      headers: { 'Authorization': `Bearer ${token}` },
      body: formData
    }
  );

  return (await response.json()).data;
};

Section 12: Response Summary Table

StatusScenarioError Code
201 ✅Success-

TEACH-01: List Teacher’s Diary Entries

Section 1: Endpoint Summary

Teacher views all diary entries they created with filtering by type, priority, date.

Section 2: HTTP Details

  • HTTP Method: GET
  • Endpoint URL: /teachers-app/digital-diary
  • Authentication: JWT (Staff)

Section 4: Query Parameters

ParameterTypeRequiredDescription
diary_typeStringNoFilter by type
grade_idUUIDNoFilter by target grade
statusStringNoFilter by status
takeIntegerNoPage size

Section 6: Response Schema (Success - 200)

{
  "status": "success",
  "data": {
    "entries": [
      {
        "id": "UUID",
        "title": "...",
        "grade": "10",
        "target_student": null,
        "diary_type": "homework",
        "due_date": "2026-03-18",
        "created_at": "2026-03-16T10:00:00.000Z"
      }
    ]
  }
}

Section 8: Implementation Examples

JavaScript:
const getMyDiaryEntries = async (token, filters = {}) => {
  const params = new URLSearchParams(filters);
  const response = await fetch(
    `https://api.skole.com/v1/teachers-app/digital-diary?${params}`,
    {
      method: 'GET',
      headers: { 'Authorization': `Bearer ${token}` }
    }
  );

  return (await response.json()).data.entries;
};

Section 12: Response Summary Table

StatusScenarioError Code
200 ✅Success-

TEACH-02: Get Entry Detail

Section 1: Endpoint Summary

Fetch complete entry details for viewing/editing.

Section 2: HTTP Details

  • HTTP Method: GET
  • Endpoint URL: /teachers-app/digital-diary/:id
  • Authentication: JWT (Staff)

Section 6: Response Schema (Success - 200)

{
  "status": "success",
  "data": {
    "id": "UUID",
    "title": "...",
    "description": "...",
    "diary_type": "homework",
    "priority": "high",
    "due_date": "2026-03-18",
    "target_grade": "10",
    "target_student": null
  }
}

Section 12: Response Summary Table

StatusScenarioError Code
200 ✅Success-

TEACH-03: Create Diary Entry

Section 1: Endpoint Summary

Teacher creates new diary entry (homework, classwork, note, reminder) for grade or specific student.

Section 2: HTTP Details

  • HTTP Method: POST
  • Endpoint URL: /teachers-app/digital-diary
  • Authentication: JWT (Staff)

Section 5: Request Body Schema

{
  "title*": "String",
  "description*": "String",
  "diary_type*": "Enum: homework, classwork, note, reminder",
  "grade_id*": "UUID",
  "student_id": "UUID (optional, for specific student)",
  "due_date*": "Date",
  "priority*": "Enum: low, medium, high",
  "attachment_url": "String (optional)"
}

Section 6: Response Schema (Success - 201)

{
  "status": "success",
  "message": "Entry created",
  "data": {
    "id": "UUID",
    "created_at": "2026-03-16T10:00:00.000Z"
  }
}

Section 7: Error Responses

400 - Invalid Type
{
  "status": "error",
  "code": "INVALID_TYPE",
  "message": "diary_type must be homework, classwork, note, or reminder"
}

Section 8: Implementation Examples

JavaScript:
const createDiaryEntry = async (token, entry) => {
  const response = await fetch(
    'https://api.skole.com/v1/teachers-app/digital-diary',
    {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${token}`,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify(entry)
    }
  );

  const data = await response.json();
  if (data.status === 'success') return data.data.id;
  throw new Error(data.message);
};

// Usage
const entryId = await createDiaryEntry(token, {
  title: 'Math Homework',
  description: 'Complete exercises 1-20',
  diary_type: 'homework',
  grade_id: 'uuid',
  due_date: '2026-03-18',
  priority: 'high'
});

Section 12: Response Summary Table

StatusScenarioError Code
201 ✅Success-
400 ❌InvalidINVALID_TYPE

TEACH-04: Update Entry

Section 1: Endpoint Summary

Teacher updates diary entry contents, deadline, or priority.

Section 2: HTTP Details

  • HTTP Method: PUT
  • Endpoint URL: /teachers-app/digital-diary/:id
  • Authentication: JWT (Staff)

Section 5: Request Body Schema

{
  "title": "String",
  "description": "String",
  "due_date": "Date",
  "priority": "Enum",
  "attachment_url": "String"
}

Section 6: Response Schema (Success - 200)

{
  "status": "success",
  "message": "Entry updated"
}

Section 8: Implementation Examples

JavaScript:
const updateDiaryEntry = async (token, entryId, updates) => {
  const response = await fetch(
    `https://api.skole.com/v1/teachers-app/digital-diary/${entryId}`,
    {
      method: 'PUT',
      headers: {
        'Authorization': `Bearer ${token}`,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify(updates)
    }
  );

  return (await response.json()).status === 'success';
};

Section 12: Response Summary Table

StatusScenarioError Code
200 ✅Success-

TEACH-05: Delete Entry

Section 1: Endpoint Summary

Teacher soft-deletes a diary entry (hidden from parents but retained in database for audit).

Section 2: HTTP Details

  • HTTP Method: DELETE
  • Endpoint URL: /teachers-app/digital-diary/:id
  • Authentication: JWT (Staff)

Section 6: Response Schema (Success - 200)

{
  "status": "success",
  "message": "Entry deleted"
}

Section 8: Implementation Examples

JavaScript:
const deleteDiaryEntry = async (token, entryId) => {
  const response = await fetch(
    `https://api.skole.com/v1/teachers-app/digital-diary/${entryId}`,
    {
      method: 'DELETE',
      headers: { 'Authorization': `Bearer ${token}` }
    }
  );

  return (await response.json()).status === 'success';
};

Section 9: Database Context

Sets deleted_status = 1, entry hidden from all consumer APIs

Section 12: Response Summary Table

StatusScenarioError Code
200 ✅Success-

ADMIN-01: List All Entries (Web App)

Section 1: Endpoint Summary

Admin views all diary entries across school with global filters.

Section 2: HTTP Details

  • HTTP Method: GET
  • Endpoint URL: /web-app/digital-diary
  • Authentication: JWT (Admin)

Section 4: Query Parameters

ParameterTypeRequiredDescription
grade_idUUIDNoFilter by grade
created_byUUIDNoFilter by teacher
diary_typeStringNoFilter by type
include_deletedBooleanNoInclude soft-deleted

Section 6: Response Schema (Success - 200)

{
  "status": "success",
  "data": {
    "entries": [...],
    "pagination": {
      "total": 450,
      "take": 20
    }
  }
}

Section 12: Response Summary Table

StatusScenarioError Code
200 ✅Success-

ADMIN-02: Get Entry Detail (Web App)

Section 1: Endpoint Summary

Admin views complete diary entry details including creator and target audience.

Section 2: HTTP Details

  • HTTP Method: GET
  • Endpoint URL: /web-app/digital-diary/:id
  • Authentication: JWT (Admin)

Section 12: Response Summary Table

StatusScenarioError Code
200 ✅Success-

ADMIN-03: Create Entry (Web App)

Section 1: Endpoint Summary

Admin creates diary entries on behalf of staff (for system announcements or corrections).

Section 2: HTTP Details

  • HTTP Method: POST
  • Endpoint URL: /web-app/digital-diary
  • Authentication: JWT (Admin)

Section 5: Request Body Schema

{
  "title*": "String",
  "description*": "String",
  "diary_type*": "Enum",
  "grade_id*": "UUID",
  "created_by*": "UUID (staff_id or admin_id)",
  "due_date*": "Date",
  "priority": "Enum"
}

Section 6: Response Schema (Success - 201)

{
  "status": "success",
  "message": "Entry created",
  "data": {"id": "UUID"}
}

Section 12: Response Summary Table

StatusScenarioError Code
201 ✅Success-

12. Summary Table: All 12 Digital Diary Endpoints

IDEndpointMethodDescriptionStatus
PARENT-01/parent-app/digital-diaryGETList entries✅ Documented
PARENT-02/parent-app/digital-diary/:idGETEntry detail✅ Documented
PARENT-03/parent-app/digital-diary/:idPUTMark completed✅ Documented
PARENT-04/parent-app/digital-diary/:id/attachmentsPOSTUpload file✅ Documented
TEACH-01/teachers-app/digital-diaryGETList entries✅ Documented
TEACH-02/teachers-app/digital-diary/:idGETEntry detail✅ Documented
TEACH-03/teachers-app/digital-diaryPOSTCreate entry✅ Documented
TEACH-04/teachers-app/digital-diary/:idPUTUpdate entry✅ Documented
TEACH-05/teachers-app/digital-diary/:idDELETEDelete entry✅ Documented
ADMIN-01/web-app/digital-diaryGETList all✅ Documented
ADMIN-02/web-app/digital-diary/:idGETEntry detail✅ Documented
ADMIN-03/web-app/digital-diaryPOSTCreate entry✅ Documented