add students api
parent
92e8ec7002
commit
9db51e8b8c
@ -0,0 +1,389 @@
|
||||
from flask import Blueprint
|
||||
from flask_restful import Api, Resource # type: ignore
|
||||
|
||||
from controllers.admin import api
|
||||
|
||||
class StudentList(Resource):
|
||||
def get(self):
|
||||
"""Get student list with filters.
|
||||
---
|
||||
tags:
|
||||
- admin/students
|
||||
summary: Get filtered student list
|
||||
description: Get list of students with various filter options
|
||||
security:
|
||||
- ApiKeyAuth: []
|
||||
parameters:
|
||||
- name: risk_level
|
||||
in: query
|
||||
type: string
|
||||
enum: [high, medium, low]
|
||||
description: Filter by risk level
|
||||
- name: last_chat_after
|
||||
in: query
|
||||
type: string
|
||||
format: date
|
||||
description: Filter by last conversation date
|
||||
- name: topics
|
||||
in: query
|
||||
type: array
|
||||
items:
|
||||
type: string
|
||||
description: Filter by conversation topics
|
||||
- name: is_anonymous
|
||||
in: query
|
||||
type: boolean
|
||||
description: Filter anonymous users
|
||||
- name: page
|
||||
in: query
|
||||
type: integer
|
||||
default: 1
|
||||
description: Page number
|
||||
- name: per_page
|
||||
in: query
|
||||
type: integer
|
||||
default: 20
|
||||
description: Items per page
|
||||
responses:
|
||||
200:
|
||||
description: Student list retrieved successfully
|
||||
schema:
|
||||
type: object
|
||||
properties:
|
||||
total:
|
||||
type: integer
|
||||
description: Total number of students matching filters
|
||||
students:
|
||||
type: array
|
||||
items:
|
||||
type: object
|
||||
properties:
|
||||
id:
|
||||
type: string
|
||||
email:
|
||||
type: string
|
||||
first_chat_at:
|
||||
type: string
|
||||
format: date-time
|
||||
last_chat_at:
|
||||
type: string
|
||||
format: date-time
|
||||
total_conversations:
|
||||
type: integer
|
||||
active_days:
|
||||
type: integer
|
||||
topics:
|
||||
type: array
|
||||
items:
|
||||
type: string
|
||||
risk_level:
|
||||
type: string
|
||||
enum: [high, medium, low]
|
||||
401:
|
||||
description: Invalid or missing API key
|
||||
400:
|
||||
description: Invalid filter parameters
|
||||
"""
|
||||
pass
|
||||
|
||||
class StudentConversation(Resource):
|
||||
def get(self, student_id):
|
||||
"""Get student's conversation history.
|
||||
---
|
||||
tags:
|
||||
- admin/students
|
||||
summary: Get student conversation history
|
||||
description: Get complete conversation history for a specific student
|
||||
security:
|
||||
- ApiKeyAuth: []
|
||||
parameters:
|
||||
- name: student_id
|
||||
in: path
|
||||
type: string
|
||||
required: true
|
||||
description: ID of the student
|
||||
- name: start_time
|
||||
in: query
|
||||
type: string
|
||||
format: date-time
|
||||
description: Filter conversations after this time
|
||||
- name: end_time
|
||||
in: query
|
||||
type: string
|
||||
format: date-time
|
||||
description: Filter conversations before this time
|
||||
- name: page
|
||||
in: query
|
||||
type: integer
|
||||
default: 1
|
||||
description: Page number
|
||||
- name: per_page
|
||||
in: query
|
||||
type: integer
|
||||
default: 50
|
||||
description: Conversations per page
|
||||
responses:
|
||||
200:
|
||||
description: Conversation history retrieved successfully
|
||||
schema:
|
||||
type: object
|
||||
properties:
|
||||
total:
|
||||
type: integer
|
||||
conversations:
|
||||
type: array
|
||||
items:
|
||||
type: object
|
||||
properties:
|
||||
timestamp:
|
||||
type: string
|
||||
format: date-time
|
||||
role:
|
||||
type: string
|
||||
enum: [user, assistant]
|
||||
content:
|
||||
type: string
|
||||
401:
|
||||
description: Invalid or missing API key
|
||||
404:
|
||||
description: Student not found
|
||||
"""
|
||||
pass
|
||||
|
||||
class StudentAnalysis(Resource):
|
||||
def get(self, student_id):
|
||||
"""Get AI analysis and intervention suggestions.
|
||||
---
|
||||
tags:
|
||||
- admin/students
|
||||
summary: Get AI analysis for student
|
||||
description: Get AI generated analysis, summary and intervention suggestions based on conversation history
|
||||
security:
|
||||
- ApiKeyAuth: []
|
||||
parameters:
|
||||
- name: student_id
|
||||
in: path
|
||||
type: string
|
||||
required: true
|
||||
description: ID of the student
|
||||
responses:
|
||||
200:
|
||||
description: Analysis retrieved successfully
|
||||
schema:
|
||||
type: object
|
||||
properties:
|
||||
summary:
|
||||
type: string
|
||||
description: Summary of conversation content and key points
|
||||
analysis:
|
||||
type: string
|
||||
description: Psychological analysis from professional perspective
|
||||
suggestions:
|
||||
type: string
|
||||
description: Intervention suggestions for counselors
|
||||
last_updated:
|
||||
type: string
|
||||
format: date-time
|
||||
401:
|
||||
description: Invalid or missing API key
|
||||
404:
|
||||
description: Student not found or no analysis available
|
||||
"""
|
||||
pass
|
||||
|
||||
class StudentStatus(Resource):
|
||||
def put(self, student_id):
|
||||
"""Update student follow-up status.
|
||||
---
|
||||
tags:
|
||||
- admin/students
|
||||
summary: Update student status
|
||||
description: Update the follow-up status of a student
|
||||
security:
|
||||
- ApiKeyAuth: []
|
||||
parameters:
|
||||
- name: student_id
|
||||
in: path
|
||||
type: string
|
||||
required: true
|
||||
description: ID of the student
|
||||
- name: body
|
||||
in: body
|
||||
required: true
|
||||
schema:
|
||||
type: object
|
||||
required:
|
||||
- status
|
||||
properties:
|
||||
status:
|
||||
type: string
|
||||
enum: [to_follow, following, resolved]
|
||||
description: |
|
||||
Follow-up status:
|
||||
* to_follow - Needs follow-up
|
||||
* following - Currently following up
|
||||
* resolved - Case resolved
|
||||
responses:
|
||||
200:
|
||||
description: Status updated successfully
|
||||
schema:
|
||||
type: object
|
||||
properties:
|
||||
success:
|
||||
type: boolean
|
||||
example: true
|
||||
updated_at:
|
||||
type: string
|
||||
format: date-time
|
||||
401:
|
||||
description: Invalid or missing API key
|
||||
404:
|
||||
description: Student not found
|
||||
400:
|
||||
description: Invalid status value
|
||||
"""
|
||||
pass
|
||||
|
||||
def get(self, student_id):
|
||||
"""Get student follow-up status history.
|
||||
---
|
||||
tags:
|
||||
- admin/students
|
||||
summary: Get status history
|
||||
description: Get the history of status changes for a student
|
||||
security:
|
||||
- ApiKeyAuth: []
|
||||
parameters:
|
||||
- name: student_id
|
||||
in: path
|
||||
type: string
|
||||
required: true
|
||||
description: ID of the student
|
||||
responses:
|
||||
200:
|
||||
description: Status history retrieved successfully
|
||||
schema:
|
||||
type: object
|
||||
properties:
|
||||
current_status:
|
||||
type: string
|
||||
enum: [to_follow, following, resolved]
|
||||
history:
|
||||
type: array
|
||||
items:
|
||||
type: object
|
||||
properties:
|
||||
status:
|
||||
type: string
|
||||
enum: [to_follow, following, resolved]
|
||||
changed_at:
|
||||
type: string
|
||||
format: date-time
|
||||
changed_by:
|
||||
type: string
|
||||
description: Email of admin who made the change
|
||||
401:
|
||||
description: Invalid or missing API key
|
||||
404:
|
||||
description: Student not found
|
||||
"""
|
||||
pass
|
||||
|
||||
class StudentNote(Resource):
|
||||
def put(self, student_id):
|
||||
"""Update student follow-up note.
|
||||
---
|
||||
tags:
|
||||
- admin/students
|
||||
summary: Update student note
|
||||
description: Update the follow-up note for a student (max 1000 characters)
|
||||
security:
|
||||
- ApiKeyAuth: []
|
||||
parameters:
|
||||
- name: student_id
|
||||
in: path
|
||||
type: string
|
||||
required: true
|
||||
description: ID of the student
|
||||
- name: body
|
||||
in: body
|
||||
required: true
|
||||
schema:
|
||||
type: object
|
||||
required:
|
||||
- note
|
||||
properties:
|
||||
note:
|
||||
type: string
|
||||
maxLength: 1000
|
||||
description: Follow-up note content
|
||||
responses:
|
||||
200:
|
||||
description: Note updated successfully
|
||||
schema:
|
||||
type: object
|
||||
properties:
|
||||
success:
|
||||
type: boolean
|
||||
example: true
|
||||
updated_at:
|
||||
type: string
|
||||
format: date-time
|
||||
401:
|
||||
description: Invalid or missing API key
|
||||
404:
|
||||
description: Student not found
|
||||
400:
|
||||
description: Note too long
|
||||
"""
|
||||
pass
|
||||
|
||||
def get(self, student_id):
|
||||
"""Get student follow-up note history.
|
||||
---
|
||||
tags:
|
||||
- admin/students
|
||||
summary: Get note history
|
||||
description: Get the history of note changes for a student
|
||||
security:
|
||||
- ApiKeyAuth: []
|
||||
parameters:
|
||||
- name: student_id
|
||||
in: path
|
||||
type: string
|
||||
required: true
|
||||
description: ID of the student
|
||||
responses:
|
||||
200:
|
||||
description: Note history retrieved successfully
|
||||
schema:
|
||||
type: object
|
||||
properties:
|
||||
current_note:
|
||||
type: string
|
||||
history:
|
||||
type: array
|
||||
items:
|
||||
type: object
|
||||
properties:
|
||||
note:
|
||||
type: string
|
||||
changed_at:
|
||||
type: string
|
||||
format: date-time
|
||||
changed_by:
|
||||
type: string
|
||||
description: Email of admin who made the change
|
||||
401:
|
||||
description: Invalid or missing API key
|
||||
404:
|
||||
description: Student not found
|
||||
"""
|
||||
pass
|
||||
|
||||
api.add_resource(StudentList, '/students')
|
||||
api.add_resource(StudentConversation, '/students/<string:student_id>/conversation')
|
||||
api.add_resource(StudentAnalysis, '/students/<string:student_id>/analysis')
|
||||
api.add_resource(StudentStatus, '/students/<string:student_id>/status')
|
||||
api.add_resource(StudentNote, '/students/<string:student_id>/note')
|
||||
|
||||
Loading…
Reference in New Issue