---
# System prepended metadata

title: '[B] Auth API'

---

```
NOTE
B = Backend
F = Frontend
```

# [B] Auth API

## ACL

| APIs\Roles             | Anonymous | Loggedin |
| ---------------------- | --------- | -------- |
| `POST /auth/authorize` | ❌        | ✅        |

## Schemas

## APIs

### `POST /api/auth/authorize`

**Request Schema**

```typescript=
{
  email: string
  password: string
}
```

**Response Schema**

```typescript=
{
  token: string
}
```

### `POST /api/auth/access-tokens`

> Aik: not sure what does this do

### `DELETE /api/auth/access-tokens`

> Aik: not sure what does this do

### `POST /api/auth/reset-password`


**Request Header**

```typescript=
{
  Authorization: "Bearer {{token}}"
}
```

**Response Schema**

```typescript=
{
  email: string
}
```

### `POST /api/auth/register`

**Request Schema**

```typescript=
{
  ...user data
}
```

**Response Schema**

```typescript=
{
  userId: string
}
```

### `GET /api/auth/userinfo`


**Request Header**

```typescript=
{
  Authorization: "Bearer {{token}}"
}
```

**Response Schema**

```typescript=
{
  ...user data
}
```

# [B] Course API

## ACL

## Schemas

###

```typescript=

```

## APIs

### `POST /api/courses`

**Request schema**

```typescript=
{
  name!: {
    th!: string
    en?: string
  }
  slug!: string
  grades?: Array<{
    id!: string
  }>
  subjects?: Array<{
    id!: string
  }>
  categories?: Array<{
    id!: string
    subCategories?: Array<{
      id!: string
    }>
  }>
  price!: {
    fullPrice!: number
    discountPrice?: number
  }
  visibility!: string
  status!: string
  description!: {
    th!: string
    en?: string
  }
  benefit!: {
    th!: string
    en?: string
  }
  language!: string
  thumbnailUrl!: {
    th!: string
    en?: string
  }
}
```

**Example request**

```jsonld=
{
  "id": "3e7fe154-732c-4918-a962-c55809826ba5",
  "name": {
    "th": "สนุกคิด คณิตรอบตัว"
  },
  "slug": "สนุกคิด-คณิตรอบตัว",
  "grades": [{
    "id": "a680ca17-ee5f-4c2a-bed3-14e5d7bdaf77"
  }],
  "subjects": [{
    "id": "f3eeca4a-62a9-497e-865b-baed08267bc5"
  }],
  "categories": [{
    "id": "771e95b6-5943-48b0-a98c-43f075e3fe2c",
    "subCategories": [{
      "id": "594d2728-8a6f-4afb-876b-775c72a4aa16"
    }]
  }],
  "price": {
    "fullPrice": 350.00,
    "discountPrice": null
  },
  "visibility": "public",
  "status": "active",
  "description": {
    "th": "คอร์สที่จะทำน้องๆเข้าใจคณิตศาสตร์จากเรื่องรอบๆตัว"
  },
  "benefit": {
    "th": "- เพิ่มความเข้าใจทางด้านคณิตศาสตร์\n- ส่งเสริมพัฒนาการทางด้านความคิดสร้างสรร"
  },
  "language": "th",
  "thumbnailUrl": {
    "th": "https://d3njjcbhbojbot.cloudfront.net/api/utilities/v1/imageproxy/https://s3.amazonaws.com/coursera_assets/ddp/branding/minnesota/ux-design-minnesota-banner.jpg?auto=format%2Ccompress&dpr=1&w=300&h=&fit=crop"
  }
}
```

**Response schema**

```typescript=
{
  id!: string
}
```

**Example response**

```jsonld=
{
  "code": 200,
  "message": "success",
  "data": {
    "id": "3e7fe154-732c-4918-a962-c55809826ba5"
  }
}
```

### `GET /api/courses`

**Response schema**

```typescript=
Array<{
  name!: {
    th!: string
    en?: string
  }
  slug!: string
  grades?: Array<{
    id!: string
    name!: {
      th!: string
      en?: string
    }
  }>
  subjects?: Array<{
    id!: string
    name!: {
      th!: string
      en?: string
    }
  }>
  categories?: Array<{
    id!: string
    name!: {
      th!: string
      en?: string
    }
    subCategories?: Array<{
      id!: string
      name!: {
        th!: string
        en?: string
      }
    }>
  }>
  price!: {
    fullPrice!: number
    discountPrice?: number
  }
  createdAt!: Date
  createdBy!: string
  updatedAt?: Date
  updatedBy?: string
}>
```

**Example response**

```jsonld=
{
  "code": 200,
  "message": "success",
  "data": [
    {
      "id": "3e7fe154-732c-4918-a962-c55809826ba5",
      "name": {
        "th": "สนุกคิด คณิตรอบตัว"
      },
      "slug": "สนุกคิด-คณิตรอบตัว",
      "grades": [{
        "id": "a680ca17-ee5f-4c2a-bed3-14e5d7bdaf77",
        "name": {
          "th": "ป.1"
        }
      }],
      "subjects": [{
        "id": "f3eeca4a-62a9-497e-865b-baed08267bc5",
        "name": {
          "th": "คณิตศาสตร์"
        }
      }],
      "categories": [{
        "id": "771e95b6-5943-48b0-a98c-43f075e3fe2c",
        "name": {
          "th": "เตรียมสอบ"
        },
        "subCategories": [{
          "id": "594d2728-8a6f-4afb-876b-775c72a4aa16",
          "name": {
            "th": "ป.1"
          }
        }]
      }],
      "price": {
        "fullPrice": 350.00,
        "discountPrice": null
      },
      "createdAt": "2020-08-19T17:59:52.482Z",
      "createdBy": "b606067c-41f1-4e0f-a192-60aadc7d94af",
      "updatedAt": "2020-08-19T17:59:52.482Z",
      "updatedBy": "b606067c-41f1-4e0f-a192-60aadc7d94af"
    }
  ],
  "meta": {
    "pagination": {
      "pageNumber": 1,
      "pageSize": 10,
      "total": 1
    },
    "searchCriteria": {
      "keyword": "สนุกคิด คณิตรอบตัว",
      "grades": ["a680ca17-ee5f-4c2a-bed3-14e5d7bdaf77"],
      "subjects": ["f3eeca4a-62a9-497e-865b-baed08267bc5"],
      "categories": ["771e95b6-5943-48b0-a98c-43f075e3fe2c"],
      "subCategories": ["594d2728-8a6f-4afb-876b-775c72a4aa16"],
      "fullPrice": { "from": 0, "to": 350 },
      "discount": false
    }
  }
}
```

### `GET /api/courses/:courseId`

**Response schema**

```typescript=
{
  name!: {
    th!: string
    en?: string
  }
  slug!: string
  grades?: Array<{
    id!: string
  }>
  subjects?: Array<{
    id!: string
  }>
  categories?: Array<{
    id!: string
    subCategories?: Array<{
      id!: string
    }>
  }>
  price!: {
    fullPrice!: number
    discountPrice?: number
  }
  visibility!: string
  status!: string
  description!: {
    th!: string
    en?: string
  }
  benefit!: {
    th!: string
    en?: string
  }
  language!: string
  thumbnailUrl!: {
    th!: string
    en?: string
  }
}
```

**Example response**

```jsonld=
{
  "code": 200,
  "message": "success",
  "data": {
    "id": "3e7fe154-732c-4918-a962-c55809826ba5",
    "name": {
      "th": "สนุกคิด คณิตรอบตัว"
    },
    "slug": "สนุกคิด-คณิตรอบตัว",
    "grades": [{
      "id": "a680ca17-ee5f-4c2a-bed3-14e5d7bdaf77"
    }],
    "subjects": [{
      "id": "f3eeca4a-62a9-497e-865b-baed08267bc5"
    }],
    "categories": [{
      "id": "771e95b6-5943-48b0-a98c-43f075e3fe2c",
      "subCategories": [{
        "id": "594d2728-8a6f-4afb-876b-775c72a4aa16"
      }]
    }],
    "price": {
      "fullPrice": 350.00,
      "discountPrice": null
    },
    "visibility": "public",
    "status": "active",
    "description": {
      "th": "คอร์สที่จะทำน้องๆเข้าใจคณิตศาสตร์จากเรื่องรอบๆตัว"
    },
    "benefit": {
      "th": "- เพิ่มความเข้าใจทางด้านคณิตศาสตร์\n- ส่งเสริมพัฒนาการทางด้านความคิดสร้างสรร"
    },
    "language": "th",
    "thumbnailUrl": {
      "th": "https://d3njjcbhbojbot.cloudfront.net/api/utilities/v1/imageproxy/https://s3.amazonaws.com/coursera_assets/ddp/branding/minnesota/ux-design-minnesota-banner.jpg?auto=format%2Ccompress&dpr=1&w=300&h=&fit=crop"
    },
    "createdAt": "2020-08-19T17:59:52.482Z",
    "createdBy": "b606067c-41f1-4e0f-a192-60aadc7d94af",
    "updatedAt": "2020-08-19T17:59:52.482Z",
    "updatedBy": "b606067c-41f1-4e0f-a192-60aadc7d94af"
  }
}
```

### `PUT /api/courses/:courseId`

**Request schema**

```typescript=
{
  name?: {
    th?: string
    en?: string
  }
  slug?: string
  grades?: Array<{
    id!: string
  }>
  subjects?: Array<{
    id!: string
  }>
  categories?: Array<{
    id!: string
    subCategories?: Array<{
      id!: string
    }>
  }>
  price?: {
    fullPrice?: number
    discountPrice?: number
  }
  visibility!: string
  status!: string
  description?: {
    th!: string
    en?: string
  }
  benefit?: {
    th!: string
    en?: string
  }
  language?: string
  thumbnailUrl?: {
    th!: string
    en?: string
  }
}
```

**Example request**

```jsonld=
{
  "id": "3e7fe154-732c-4918-a962-c55809826ba5",
  "name": {
    "th": "สนุกคิด คณิตรอบตัว"
  },
  "slug": "สนุกคิด-คณิตรอบตัว",
  "grades": [{
    "id": "a680ca17-ee5f-4c2a-bed3-14e5d7bdaf77"
  }],
  "subjects": [{
    "id": "f3eeca4a-62a9-497e-865b-baed08267bc5"
  }],
  "categories": [{
    "id": "771e95b6-5943-48b0-a98c-43f075e3fe2c",
    "subCategories": [{
      "id": "594d2728-8a6f-4afb-876b-775c72a4aa16"
    }]
  }],
  "price": {
    "fullPrice": 350.00,
    "discountPrice": null
  },
  "visibility": "public",
  "status": "active",
  "description": {
    "th": "คอร์สที่จะทำน้องๆเข้าใจคณิตศาสตร์จากเรื่องรอบๆตัว"
  },
  "benefit": {
    "th": "- เพิ่มความเข้าใจทางด้านคณิตศาสตร์\n- ส่งเสริมพัฒนาการทางด้านความคิดสร้างสรร"
  },
  "language": "th",
  "thumbnailUrl": {
    "th": "https://d3njjcbhbojbot.cloudfront.net/api/utilities/v1/imageproxy/https://s3.amazonaws.com/coursera_assets/ddp/branding/minnesota/ux-design-minnesota-banner.jpg?auto=format%2Ccompress&dpr=1&w=300&h=&fit=crop"
  }
}
```

**Response schema**

```typescript=
{
  id!: string
}
```

**Example response**

```jsonld=
{
  "code": 200,
  "message": "success",
  "data": {
    "id": "3e7fe154-732c-4918-a962-c55809826ba5"
  }
}
```

### `DELETE /api/courses/:courseId`

**Response schema**

```typescript=
{
  id!: string
}
```

**Example response**

```jsonld=
{
  "code": 200,
  "message": "success",
  "data": {
    "id": "3e7fe154-732c-4918-a962-c55809826ba5"
  }
}
```

# [B] Course's Instructor

## ACL

## Schemas

## APIS

### `POST /api/course-instructors?courseId=:courseId`

**Request schema**

```jsonld=
{
  instructor!: {
    id!: string
  }
  description?: {
    th?: string
    en?: string
  }
}
```

**Example request**

```jsonld=
{
  "instructor": {
    "id": "3e7fe154-732c-4918-a962-c55809826ba5"
  },
  "description": {
    "th": "ประวัติวิทยากรอย่างย่อ"
  }
}
```

**Response schema**

```jsonld=
{
  id!: string
}
```

**Example response**

```jsonld=
{
  "code": 200,
  "message": "success",
  "data": {
    "id": "3e7fe154-732c-4918-a962-c55809826ba5"
  }
}
```

### `GET /api/course-instructors?courseId=:courseId`

**Response schema**

```jsonld=
Array<{
  id!: string
  instructor!: {
    id: string
    firstName!: {
      th!: string
      en?: string
    }
    lastName!: {
      th!: string
      en?: string
    }
    imageUrl?: string
  }
  description?: {
    th!: string
    en?: string
  }
}>
```

**Example response**

```jsonld=
{
  "code": 200,
  "message": "success",
  "data": [{
    "id": "3e7fe154-732c-4918-a962-c55809826ba5",
    "instructor": {
      "id": "3e7fe154-732c-4918-a962-c55809826ba5",
      "firstName": {
        "th": "รัก"
      },
      "lastName": {
        "th": "เรียนรู้"
      },
      "imageUrl": "https://www.pngitem.com/pimgs/m/146-1468479_my-profile-icon-blank-profile-picture-circle-hd.png"
    }
    "description": {
      "th": "ประวัติวิทยากรอย่างย่อ"
    }
  }],
  "meta": {
    "pagination": {
      "pageNumber": 1,
      "pageSize": 10,
      "total": 1
    }
  }
}
```

### `GET /api/course-instructors/:courseInstructorId`

**Response schema**

```jsonld=
{
  id: string
  instructor!: {
    id!: string
    firstName!: {
      th!: string
      en?: string
    }
    lastName!: {
      th!: string
      en?: string
    }
    imageUrl?: string
  }
  description?: {
    th!: string
    en?: string
  }
}
```

**Example response**

```jsonld=
{
  "code": 200,
  "message": "success",
  "data": {
    "id": "3e7fe154-732c-4918-a962-c55809826ba5",
    "instructor": {
      "id": "3e7fe154-732c-4918-a962-c55809826ba5",
      "firstName": {
        "th": "รัก"
      },
      "lastName": {
        "th": "เรียนรู้"
      },
      "imageUrl": "https://www.pngitem.com/pimgs/m/146-1468479_my-profile-icon-blank-profile-picture-circle-hd.png"
    }
    "description": {
      "th": "ประวัติวิทยากรอย่างย่อ"
    }
  }
}
```

### `PUT /api/course-instructors/:courseInstructorId`

**Request schema**

```jsonld=
{
  instructor?: {
    id!: string
  }
  description?: {
    th!: string
    en?: string
  }
}
```

**Example request**

```jsonld=
{
  "instructor": {
    "id": "3e7fe154-732c-4918-a962-c55809826ba5"
  },
  "description": {
    "th": "ประวัติวิทยากรอย่างย่อ"
  }
}
```

**Response schema**

```jsonld=
{
  id!: string
}
```

**Example response**

```jsonld=
{
  "code": 200,
  "message": "success",
  "data": {
    "id": "3e7fe154-732c-4918-a962-c55809826ba5"
  }
}
```

### `DELETE /api/course-instructors/:courseInstructorId`

**Response schema**

```jsonld=
{
  id!: string
  deletedAt!: Date
  deletedBy!: string
}
```

**Example response**

```jsonld=
{
  "code": 200,
  "message": "success",
  "data": {
    "id": "3e7fe154-732c-4918-a962-c55809826ba5",
    "deletedAt": "2020-08-19T17:59:52.482Z",
    "deletedBy": "3e7fe154-732c-4918-a962-c55809826ba5"
  }
}
```

# [B] Course's Section API

## ACL

## Schemas

### `CourseSection` Model

```typescript=
{
  name: {
    th: string
    en: string
  }
  order: number
}
```

## APIS

### `POST /api/course-sections?courseId=:courseId`

**Request schema**

```typescript=
{
  name!: {
    th!: string
    en?: string
  }
  order: number
}
```

**Example request**

```jsonld=

```

**Response schema**

```typescript=
{
  sectionId: string
  createdAt: Date
  createdBy: string
}
```

**Example response**

```jsonld=

```

### `GET /api/course-sections?courseId=:courseId`

**Response schema**

```typescript=
Array<CourseSection>
```

**Example response**

```jsonld=

```

### `GET /api/course-sections/:sectionId`

**Response schema**

```typescript=
{
  sectionId: string
  ...CourseSection
}
```

**Example response**

```jsonld=

```

### `PUT /api/course-sections/:sectionId`

**Request schema**

```jsonld=
Partial<CourseSection>
```

**Example request**

```jsonld=

```

**Response schema**

```jsonld=
{
  sectionId: string
  ...CourseSection
}
```

**Example response**

```jsonld=

```

### `DELETE /api/course-sections/:sectionId`

**Response schema**

```jsonld=
{
  
}
```

**Example response**

```jsonld=

```

## Section's Content API

## ACL

## Schemas

### `SectionContent` Model

```typescript=
{
  contentId: string
  name: {
    th: string
    en: string
  }
  type: 'VIDEO' | 'QUIZ' | 'ASSIGNMENT' | 'FILE' | 'PDF'
  order: number
}
```


#### `VIDEO` Content

```typescript=
{
  ...
  contentData: {
    youtubeUrl: string
    previewYoutubeUrl: string
    description: {
      th: string
      en: string
    }
    videoTimeSecond: number
    canPreview: boolean
  }
}
```

#### `QUIZ` Content

```typescript=
{
  ...
  contentData: {
    iframeUrl: string
    description: {
      th: string
      en: string
    }
    maxScore: number
    timeLimitSecond: number
  }
}
```

#### `FILE` Content

```typescript=
{
  ...
  contentData: {
    fileUrl: string
    description: {
      th: string
      en: string
    }
    sizeKB: number
  }
}
```

#### `PDF` Content

```typescript=
{
  ...
  contentData: {
    pdfUrl: string
    description: {
      th: string
      en: string
    }
    canDownload: boolean
  }
}
```

#### `ASSIGNMENT` Content

```typescript=
{
  ...
  contentData: {
    ...?
  }
}
```

## APIS


### `POST /api/section-contents?sectionId=:sectionId`

**Request schema**

```jsonld=
{
  ...SectionContent (without contentId)
}
```

**Example request**

```jsonld=

```

**Response schema**

```jsonld=
{
  contentId: string
  ...SectionContent
}
```

**Example response**

```jsonld=

```

### `GET /api/section-contents?sectionId=:sectionId`

**Response schema**

```jsonld=
Array<SectionContent>
```

**Example response**

```jsonld=

```

### `GET /api/section-contents/:contentId`

**Response schema**

```jsonld=
{
  ...SectionContent
}
```

**Example response**

```jsonld=

```

### `PUT /api/section-contents/:contentId`

**Request schema**

```typescript=
Partial<SectionContent>
```

**Example request**

```jsonld=

```

**Response schema**

```typescript=
{
  ...SectionContent
}
```

**Example response**

```jsonld=

```

### `DELETE /api/section-contents/:contentId`

**Response schema**

```typescript=
{
  contentId: string
}
```

**Example response**

```jsonld=

```

## Course's Session API

## ACL

## Schemas

### `CourseSession` Model

```typescript=
{
  sessionId: string
  name: {
    th: string
    en: string
  }
  detail: {
    description: {
      th: string
      en: string
    }
    ...more detail?
  }
  registrationDateStart: string // ISO
  registrationDateEnd: string // ISO
  learningDateStart: string // ISO
  learningDateEnd: string // ISO
  publicType: 'PUBLIC' | 'PRIVATE'
  isActive: boolean
}
```

## APIS

### `POST /api/course-sessions?courseId=:courseId`

**Request Schema**

```typescript=
{
  ...CourseSession (without sessionId)
}
```

**Example Request**

```jsonld=

```

**Response schema**

```jsonld=
Array<CourseSession>
```

**Example response**

```jsonld=

```

### `GET /api/course-sessions/:courseSessionId`

**Response schema**

```jsonld=
{
  ...CourseSession
}
```

**Example response**

```jsonld=

```

### `GET /api/course-sessions?courseId=:courseId`

**Response schema**

```jsonld=
Array<CourseSession>
```

**Example response**

```jsonld=

```

### `GET /api/course-sessions/:courseSessionId`

**Response schema**

```jsonld=
{
  ...CourseSession
}
```

**Example response**

```jsonld=

```

### `PUT /api/course-sessions/:courseSessionId`

**Request schema**

```jsonld=
{
  ...Partial<CourseSession>
}
```

**Example request**

```jsonld=

```

**Response schema**

```jsonld=
{
  ...CourseSession
}
```

**Example response**

```jsonld=

```

### `DELETE /api/course-sessions/:courseSessionId`

**Response schema**

```jsonld=
{
  sessionId: string
}
```

**Example response**

```jsonld=

```

# [B] Course's Material API

## ACL

## Schemas

## APIS

### `POST /api/course-materials?courseId=:courseId`

**Request schema**

```jsonld=

```

**Example request**

```jsonld=

```

**Response schema**

```jsonld=

```

**Example response**

```jsonld=

```

### `GET /api/course-materials?courseId=:courseId`

**Response schema**

```jsonld=

```

**Example response**

```jsonld=

```

### `GET /api/course-materials/:materialId`

### `PUT /api/course-materials/:materialId`

### `DELETE /api/course-materials/:materialId`

## Grade API

### `POST /api/grades`

**Request schema**

```typescript=
{
  name!: {
    th!: string
    en?: string
  }
  status!: string
}
```

**Example request**

```jsonld=
{
  "name": {
    "th": "ประถมศึกษา"
  },
  "status": "active"
}
```

**Response schema**

```typescript=
{
  id!: string
}
```

**Example response**

```jsonld=
{
  "code": 200,
  "message": "success",
  "data": {
    "id": "b6de786f-023a-4587-b745-47f3ec50b32d"
  }
}
```

### `GET /api/grades`

**Response schema**

```typescript=
Array<{
  id!: string
  name!: {
    th!: string
    en?: string
  }
  status!: string
  createdAt!: Date
  createdBy!: string
  updatedAt?: Date
  updatedBy?: string
}>
```

**Example response**

```jsonld=
{
  "code": 200,
  "message": "success",
  "data": [{
    "id": "b6de786f-023a-4587-b745-47f3ec50b32d",
    "name": {
      "th": "ประถมศึกษา"
    },
    "status": "active",
    "createdAt": "2020-08-19T17:59:52.482Z",
    "createdBy": "3e7fe154-732c-4918-a962-c55809826ba5",
    "updatedAt": "2020-08-19T17:59:52.482Z",
    "updatedBy": "3e7fe154-732c-4918-a962-c55809826ba5"
  }],
  "meta": {
    "pagination": {
      "pageNumber": 1,
      "pageSize": 10,
      "total": 1
    }
  }
}
```

### `GET /api/grades/:gradeId`

**Response schema**

```typescript=
{
  id!: string
  name!: {
    th!: string
    en?: string
  }
  status!: string
  createdAt!: Date
  createdBy!: string
  updatedAt?: Date
  updatedBy?: string
}
```

**Example response**

```jsonld=
{
  "code": 200,
  "message": "success",
  "data": {
    "id": "b6de786f-023a-4587-b745-47f3ec50b32d",
    "name": {
      "th": "ประถมศึกษา"
    },
    "status": "active",
    "createdAt": "2020-08-19T17:59:52.482Z",
    "createdBy": "3e7fe154-732c-4918-a962-c55809826ba5",
    "updatedAt": "2020-08-19T17:59:52.482Z",
    "updatedBy": "3e7fe154-732c-4918-a962-c55809826ba5"
  }
}
```

### `PUT /api/grades/:gradeId`

**Request schema**

```typescript=
{
  name?: {
    th?: string
    en?: string
  }
  status?: string
}
```

**Example request**

```jsonld=
{
  "name": {
    "th": "ประถมศึกษา"
  },
  "status": "active"
}
```

**Response schema**

```typescript=
{
  id!: string
}
```

**Example response**

```jsonld=
{
  "code": 200,
  "message": "success",
  "data": {
    "id": "b6de786f-023a-4587-b745-47f3ec50b32d"
  }
}
```

### `DELETE /api/grades/:gradeId`

**Response schema**

```typescript=
{
  id!: string
  deletedAt!: Date
  deletedBy!: string
}
```

**Example response**

```jsonld=
{
  "code": 200,
  "message": "success",
  "data": {
    "id": "3e7fe154-732c-4918-a962-c55809826ba5",
    "deletedAt": "2020-08-19T17:59:52.482Z",
    "deletedBy": "3e7fe154-732c-4918-a962-c55809826ba5"
  }
}
```

# [B] Subject API

## ACL

## Schemas

## APIS

**Request schema**

```typescript=
{
  name!: {
    th!: string
    en?: string
  }
  status!: string
}
```

**Example request**

```jsonld=
{
  "name": {
    "th": "คณิตศาสตร์"
  },
  "status": "active"
}
```

**Response schema**

```typescript=
{
  id!: string
}
```

**Example response**

```jsonld=
{
  "code": 200,
  "message": "success",
  "data": {
    "id": "b6de786f-023a-4587-b745-47f3ec50b32d"
  }
}
```

### `GET /api/subjects`

**Response schema**

```typescript=
Array<{
  id!: string
  name!: {
    th!: string
    en?: string
  }
  status!: string
  createdAt!: Date
  createdBy!: string
  updatedAt?: Date
  updatedBy?: string
}>
```

**Example response**

```jsonld=
{
  "code": 200,
  "message": "success",
  "data": [{
    "id": "b6de786f-023a-4587-b745-47f3ec50b32d",
    "name": {
      "th": "คณิตศาสตร์"
    },
    "status": "active",
    "createdAt": "2020-08-19T17:59:52.482Z",
    "createdBy": "3e7fe154-732c-4918-a962-c55809826ba5",
    "updatedAt": "2020-08-19T17:59:52.482Z",
    "updatedBy": "3e7fe154-732c-4918-a962-c55809826ba5"
  }],
  "meta": {
    "pagination": {
      "pageNumber": 1,
      "pageSize": 10,
      "total": 1
    }
  }
}
```

### `PUT /api/subjects/:subjectId`

**Request schema**

```typescript=
{
  name?: {
    th?: string
    en?: string
  }
  status!: string
}
```

**Example request**

```jsonld=
{
  "name": {
    "th": "คณิตศาสตร์"
  },
  "status": "active"
}
```

**Response schema**

```typescript=
{
  id!: string
}
```

**Example response**

```jsonld=
{
  "code": 200,
  "message": "success",
  "data": {
    "id": "b6de786f-023a-4587-b745-47f3ec50b32d"
  }
}
```

### `DELETE /api/subjects/:subjectId`

**Response schema**

```typescript=
{
  id!: string
  deletedAt!: Date
  deletedBy!: string
}
```

**Example response**

```jsonld=
{
  "code": 200,
  "message": "success",
  "data": {
    "id": "3e7fe154-732c-4918-a962-c55809826ba5",
    "deletedAt": "2020-08-19T17:59:52.482Z",
    "deletedBy": "3e7fe154-732c-4918-a962-c55809826ba5"
  }
}
```

# [B] Category API

## ACL

## Schemas

## APIS

### `POST /api/categories`

**Request schema**

```typescript=
{
  name!: {
    th!: string
    en?: string
  }
  slug!: string
  status!: string
}
```

**Example request**

```jsonld=
{
  "name": {
    "th": "ติวข้อสอบ"
  },
  "slug": "ติวข้อสอบ",
  "status": "active"
}
```

**Response schema**

```typescript=
{
  id!: string
}
```

**Example response**

```jsonld=
{
  "code": 200,
  "message": "success",
  "data": {
    "id": "b6de786f-023a-4587-b745-47f3ec50b32d"
  }
}
```

### `GET /api/categories`

**Response schema**

```typescript=
Array<{
  id!: string
  name!: {
    th!: string
    en?: string
  }
  slug!: string
  status!: string
  numberOfSubCategory!: number
  createdAt!: Date
  createdBy!: string
  updatedAt?: Date
  updatedBy?: string
}>
```

**Example response**

```jsonld=
{
  "code": 200,
  "message": "success",
  "data": [{
    "id": "b6de786f-023a-4587-b745-47f3ec50b32d",
    "name": {
      "th": "ติวข้อสอบ"
    },
    "slug": "ติวข้อสอบ",
    "status": "active",
    "numberOfSubCategory": 0,
    "createdAt": "2020-08-19T17:59:52.482Z",
    "createdBy": "3e7fe154-732c-4918-a962-c55809826ba5",
    "updatedAt": "2020-08-19T17:59:52.482Z",
    "updatedBy": "3e7fe154-732c-4918-a962-c55809826ba5"
  }],
  "meta": {
    "pagination": {
      "pageNumber": 1,
      "pageSize": 10,
      "total": 1
    }
  }
}
```

### `GET /api/categories/:categoryId`

**Response schema**

```typescript=
{
  id!: string
  name!: {
    th!: string
    en: string
  }
  slug!: string
  status!: string
  numberOfSubCategory!: number
  createdAt!: Date
  createdBy!: string
  updatedAt?: Date
  updatedBy?: string
}
```

**Example response**

```jsonld=
{
  "code": 200,
  "message": "success",
  "data": {
    "id": "b6de786f-023a-4587-b745-47f3ec50b32d",
    "name": {
      "th": "ติวข้อสอบ"
    },
    "slug": "ติวข้อสอบ",
    "status": "active",
    "numberOfSubCategory": 0,
    "createdAt": "2020-08-19T17:59:52.482Z",
    "createdBy": "3e7fe154-732c-4918-a962-c55809826ba5",
    "updatedAt": "2020-08-19T17:59:52.482Z",
    "updatedBy": "3e7fe154-732c-4918-a962-c55809826ba5"
  }
}
```

### `PUT /api/categories/:categoryId`

```typescript=
{
  name?: {
    th?: string
    en?: string
  }
  slug?: string
  status?: string
}
```

**Example request**

```jsonld=
{
  "name": {
    "th": "หลักสูตร"
  },
  "slug": "หลักสูตร",
  "status": "active"
}
```

**Response schema**

```typescript=
{
  id!: string
  updatedAt?: Date
  updatedBy?: string
}
```

**Example response**

```jsonld=
{
  "code": 200,
  "message": "success",
  "data": {
    "id": "b6de786f-023a-4587-b745-47f3ec50b32d",
    "updatedAt": "2020-08-19T17:59:52.482Z",
    "updatedBy": "3e7fe154-732c-4918-a962-c55809826ba5"
  }
}
```

### `DELETE /api/categories/:categoryId`

**Response schema**

```typescript=
{
  id!: string
  deletedAt!: Date
  deletedBy!: string
}
```

**Example response**

```jsonld=
{
  "code": 200,
  "message": "success",
  "data": {
    "id": "b6de786f-023a-4587-b745-47f3ec50b32d",
    "deletedAt": "2020-08-19T17:59:52.482Z",
    "deletedBy": "3e7fe154-732c-4918-a962-c55809826ba5"
  }
}
```

# [B] Category's Sub Category API

## ACL

## Schemas

## APIS

### `POST /api/sub-categories?categoryId=:categoryId`

**Request schema**

```typescript=
{
  name!: {
    th!: string
    en?: string
  }
  slug!: string
  status!: string
}
```

**Example request**

```jsonld=
{
  "name": {
    "th": "GAT"
  },
  "slug": "gat",
  "status": "active"
}
```

**Response schema**

```typescript=
{
  id!: string
}
```

**Example response**

```jsonld=
{
  "code": 200,
  "message": "success",
  "data": {
    "id": "b6de786f-023a-4587-b745-47f3ec50b32d"
  }
}
```

### `GET /api/sub-categories?categoryId=:categoryId`

**Response schema**

```typescript=
Array<{
  id!: string
  name!: {
    th!: string
    en?: string
  }
  slug!: string
  status!: string
  createdAt!: Date
  createdBy!: string
  updatedAt?: Date
  updatedBy?: string
}>
```

**Example response**

```jsonld=
{
  "code": 200,
  "message": "success",
  "data": [{
    "id": "b6de786f-023a-4587-b745-47f3ec50b32d",
    "name": {
      "th": "GAT"
    },
    "slug": "gat",
    "status": "active",
    "createdAt": "2020-08-19T17:59:52.482Z",
    "createdBy": "3e7fe154-732c-4918-a962-c55809826ba5",
    "updatedAt": "2020-08-19T17:59:52.482Z",
    "updatedBy": "3e7fe154-732c-4918-a962-c55809826ba5"
  }],
  "meta": {
    "pagination": {
      "pageNumber": 1,
      "pageSize": 10,
      "total": 1
    }
  }
}
```

### `GET /api/sub-categories/:subCategoryId`

**Response schema**

```typescript=
{
  id!: string
  name?: {
    th!: string
    en?: string
  }
  slug?: string
  status!: string
  createdAt!: Date
  createdBy!: string
  updatedAt?: Date
  updatedBy?: string
}
```

**Example response**

```jsonld=
{
  "code": 200,
  "message": "success",
  "data": {
    "id": "b6de786f-023a-4587-b745-47f3ec50b32d",
    "name": {
      "th": "GAT"
    },
    "slug": "gat",
    "status": "active",
    "createdAt": "2020-08-19T17:59:52.482Z",
    "createdBy": "3e7fe154-732c-4918-a962-c55809826ba5",
    "updatedAt": "2020-08-19T17:59:52.482Z",
    "updatedBy": "3e7fe154-732c-4918-a962-c55809826ba5"
  }
}
```

### `PUT /api/sub-categories/:subCategoryId`

```typescript=
{
  name?: {
    th?: string
    en?: string
  }
  slug?: string
  status?: string
}
```

**Example request**

```jsonld=
{
  "name": {
    "th": "GAT"
  },
  "slug": "gat",
  "status": "active"
}
```

**Response schema**

```typescript=
{
  id!: string
  updatedAt?: Date
  updatedBy?: string
}
```

**Example response**

```jsonld=
{
  "code": 200,
  "message": "success",
  "data": {
    "id": "b6de786f-023a-4587-b745-47f3ec50b32d",
    "updatedAt": "2020-08-19T17:59:52.482Z",
    "updatedBy": "3e7fe154-732c-4918-a962-c55809826ba5"
  }
}
```

### `DELETE /api/sub-categories/:subCategoryId`

**Response schema**

```typescript=
{
  id!: string
  deletedAt!: Date
  deletedBy!: string
}
```

**Example response**

```jsonld=
{
  "code": 200,
  "message": "success",
  "data": {
    "id": "b6de786f-023a-4587-b745-47f3ec50b32d",
    "deletedAt": "2020-08-19T17:59:52.482Z",
    "deletedBy": "3e7fe154-732c-4918-a962-c55809826ba5"
  }
}
```

# [B] Instructor API

## ACL

## Schemas

## APIS

### `POST /api/instructors`

**Request schema**

```typescript=
{
  firstName!: {
    th!: string
    en?: string
  }
  lastName!: {
    th!: string
    en?: string
  }
  position!: string
  imageUrl?: string
  educationExperiences!: Array<{
    educationLevel!: string
    schoolName!: string
    position!: strign
  }>
  workExperiences!: Array<string>
}
```

**Example request**

```jsonld=
{
  "firstName": {
    "th": "รัก"
  },
  "lastName": {
    "th": "เรียนรู้"
  },
  "imageUrl": "https://www.pngitem.com/pimgs/m/146-1468479_my-profile-icon-blank-profile-picture-circle-hd.png",
  "educationExperiences": [{
    "educationLevel": "elementary",
    "schoolName": "สถานศึกษา",
    "position": "วิทย์-คณิต"
  }],
  "workExperiences": ["ครูชำนาญการ โรงเรียนหมีใหญ่"]
}
```

**Response schema**

```typescript=
{
  id!: string
}
```

**Example response**

```jsonld=
{
  "code": 200,
  "message": "success",
  "data": {
    "id": "b6de786f-023a-4587-b745-47f3ec50b32d"
  }
}
```

### `GET /api/instructors`

**Response schema**

```typescript=
Array<{
  id!: string
  firstName!: {
    th!: string
    en?: string
  }
  lastName!: {
    th!: string
    en?: string
  }
  position!: string
  imageUrl?: string
  educationExperiences!: Array<{
    educationLevel!: string
    schoolName!: string
    position!: strign
  }>
  workExperiences!: Array<string>
}>
```

**Example response**

```jsonld=
{
  "code": 200,
  "message": "success",
  "data": [{
    "id": "3e7fe154-732c-4918-a962-c55809826ba5",
    "firstName": {
      "th": "รัก"
    },
    "lastName": {
      "th": "เรียนรู้"
    },
    "imageUrl": "https://www.pngitem.com/pimgs/m/146-1468479_my-profile-icon-blank-profile-picture-circle-hd.png",
    "educationExperiences": [{
      "educationLevel": "elementary",
      "schoolName": "สถานศึกษา",
      "position": "วิทย์-คณิต"
    }],
    "workExperiences": ["ครูชำนาญการ โรงเรียนหมีใหญ่"]
  }],
  "meta": {
    "pagination": {
      "pageNumber": 1,
      "pageSize": 10,
      "total": 1
    }
  }
}
```

### `GET /api/instructors/:instructorId`

**Response schema**

```typescript=
Array<{
  id!: string
  firstName!: {
    th!: string
    en?: string
  }
  lastName!: {
    th!: string
    en?: string
  }
  position!: string
  imageUrl?: string
  educationExperiences!: Array<{
    educationLevel!: string
    schoolName!: string
    position!: strign
  }>
  workExperiences!: Array<string>
}>
```

**Example response**

```jsonld=
{
  "code": 200,
  "message": "success",
  "data": {
    "id": "3e7fe154-732c-4918-a962-c55809826ba5",
    "firstName": {
      "th": "รัก"
    },
    "lastName": {
      "th": "เรียนรู้"
    },
    "imageUrl": "https://www.pngitem.com/pimgs/m/146-1468479_my-profile-icon-blank-profile-picture-circle-hd.png",
    "educationExperiences": [{
      "educationLevel": "elementary",
      "schoolName": "สถานศึกษา",
      "position": "วิทย์-คณิต"
    }],
    "workExperiences": ["ครูชำนาญการ โรงเรียนหมีใหญ่"]
  }
}
```

### `PUT /api/instructors/:instructorId`

**Request schema**

```typescript=
{
  firstName?: {
    th?: string
    en?: string
  }
  lastName?: {
    th?: string
    en?: string
  }
  position?: string
  imageUrl?: string
  educationExperiences?: Array<{
    educationLevel!: string
    schoolName!: string
    position!: strign
  }>
  workExperiences?: Array<string>
}
```

**Example request**

```jsonld=
{
  "firstName": {
    "th": "รัก"
  },
  "lastName": {
    "th": "เรียนรู้"
  },
  "imageUrl": "https://www.pngitem.com/pimgs/m/146-1468479_my-profile-icon-blank-profile-picture-circle-hd.png",
  "educationExperiences": [{
    "educationLevel": "elementary",
    "schoolName": "สถานศึกษา",
    "position": "วิทย์-คณิต"
  }],
  "workExperiences": ["ครูชำนาญการ โรงเรียนหมีใหญ่"]
}
```

**Response schema**

```typescript=
{
  id!: string
}
```

**Example response**

```jsonld=
{
  "code": 200,
  "message": "success",
  "data": {
    "id": "b6de786f-023a-4587-b745-47f3ec50b32d"
  }
}
```

### `DELETE /api/instructors/:instructorId`

**Response schema**

```typescript=
{
  id!: string
  deletedAt!: Date
  deletedBy!: string
}
```

**Example response**

```jsonld=
{
  "code": 200,
  "message": "success",
  "data": {
    "id": "b6de786f-023a-4587-b745-47f3ec50b32d",
    "deletedAt": "2020-08-19T17:59:52.482Z",
    "deletedBy": "3e7fe154-732c-4918-a962-c55809826ba5"
  }
}
```

# [B] Admin Group API

## ACL

## Schemas

### `AdminGroup`

```typescript=
{
  adminGroupId: string
  name: string
  permissions: Array<{
    name: {
      th: string
      en: string
    }
    slug: string
  }>
}
```

## APIS

### `POST /api/admin-groups`

**Request Schema**

```typescript=
{
  ...AdminGroup (without adminGroupId)
}
```

**Response Schema**

```typescript=
{
  adminGroupId: string
  ...AdminGroup
}
```

### `GET /api/admin-groups`

**Response Schema**

```typescript=
Array<AdminGroup>
```

### `GET /api/admin-groups/:adminGroupId`

**Response Schema**

```typescript=
{
  ...AdminGroup
}
```

### `PUT /api/admin-groups/:adminGroupId`

**Request Schema**

```typescript=
{
  ...Partial<AdminGroup>
}
```

**Response Schema**

```typescript=
{
  ...AdminGroup
}
```

### `DELETE /api/admin-groups/:adminGroupId`


**Response Schema**

```typescript=
{
  adminGroupId: string
}
```

# [B] Admin API

## ACL

## Schemas

### `Admin`

```typescript=
{
  adminId: string
  username: string
  email: string
}
```

## APIS

### `POST /api/admins`

**Request Schema**

```typescript=
{
  ...Admin (without adminId)
}
```

**Response Schema**

```typescript=
{
  adminId: string
  ...Admin
}
```

### `GET /api/admins`

**Response Schema**

```typescript=
Array<Admin>
```

### `GET /api/admins/:adminId`

**Response Schema**

```typescript=
{
  ...Admin
}
```

### `PUT /api/admins/:adminId`

**Request Schema**

```typescript=
{
  ...Partial<Admin>
}
```

**Response Schema**

```typescript=
{
  ...Admin
}
```

### `DELETE /api/admins/:adminId`


**Response Schema**

```typescript=
{
  adminId: string
}
```

# [F] Course API

## ACL

## Schemas

## APIS

### `GET /api/courses`

**Response schema**

```typescript=
Array<{
  slug!: string
  name!: {
    th!: string
    en?: string
  }
  description!: {
    th!: string
    en?: string
  }
  thumbnailUrl!: {
    th!: string
    en?: string
  }
  subCategories!: Array<{
    name!: {
      th!: string
      en?: string
    }
    categories: {
      slug!: string
      name!: {
        th!: string
        en?: string
      }
    }
  }>
  subjects!: Array<{
    name!: {
      th!: string
      en?: string
    }
  }>
  instructors!: Array<{
    name!: {
      th!: string
      en?: string
    }
  }>
  fullPrice!: number
  discountPrice?: number
  duration!: number
}>
```

**Sample response**

```jsonld=
{
}
```

### `GET /api/courses/:slug`

**Response schema**

```typescript=
{
  slug!: string
  name!: {
    th!: string
    en?: string
  }
  description!: {
    th!: string
    en?: string
  }
  thumbnailUrl!: {
    th!: string
    en?: string
  }
  previewVideoUrl!: {
    th!: string
    en?: string
  }
  subCategories!: Array<{
    name!: {
      th!: string
      en?: string
    }
    categories: {
      slug!: string
      name!: {
        th!: string
        en?: string
      }
    }
  }>
  subjects!: Array<{
    name!: {
      th!: string
      en?: string
    }
  }>
  fullPrice!: number
  discountPrice?: number
  duration!: number
}
```

**Sample response**

```jsonld=
{

}
```

# [F] Categories API

