api-spec/daisy/schema.md

6.3 KiB

Specifikation för att hämta kurser och scheman i Daisys nya API

Hämta lista på kurser

Förfrågan

> GET /v1/users/me/courses
> Authorization: Bearer <oauth 2 token>
> Accept: application/json

Ger mig (identifierad av oauth 2 token) alla mina kurser med delkurstillfällen jag är registrerad/deltagare på.

Svar

< 200 OK
< Content-Type: application/json
[
    {
        "code": "PROLED",
        "occasions": [
            {
                "id": "123456",
                "semester": "VT2025",
                "start": "2025-01-03",
                "end": "2025-06-03",
                "teachers": [{ "principal": "teacher1@su" }, { "principal": "teacher2@su" }]
            },
            {
                "id": "1234567",
                "semester": "HT2025",
                "start": "2025-09-03",
                "end": "2026-01-03",
                "teachers": [{ "principal": "teacher1@su" }, { "principal": "teacher2@su" }]
            }
        ]
    },
    {
        "code": "PROTO2",
        "occasions": [
            {
                "id": "123456",
                "semester": "HT2025",
                "start": "2025-09-03",
                "end": "2026-01-03",
                "teachers": [{ "principal": "teacher3@su" }, { "principal": "teacher4@su" }]
            }
        ]
    }
]

Hämta kursschema

Förfrågan

> GET /v1/courses/:courseId/schedule
> Authorization: Bearer <oauth 2 token>
> Accept: application/json

type (string, enum):

Value Description
teaching Undervisning
exam Tenta
deadline Deadline
[
    {
        "type": "teaching",
        "name": "Föreläsning 1",
        "shortname": "F1",
        "starttime": "2025-01-03T10:00:00Z",
        "endtime": "2025-01-03T12:00:00Z",
        "location": [{ "name": "L30" }],
        "description": "Lecture on API Design",
        "participants": [
            { "principal": "teacher1@su", "role": "teacher" },
            { "principal": "teacher2@su", "role": "teacher" }
        ]
    },
    {
        "type": "teaching",
        "name": "Workshop 1",
        "shortname": "W1",
        "group": "1",
        "starttime": "2025-01-03T10:00:00Z",
        "endtime": "2025-01-03T12:00:00Z",
        "location": [{ "name": "L50" }],
        "description": "Workshop on Microservices",
        "participants": [
            { "principal": "teacher1@su", "role": "teacher" },
            { "principal": "teacher2@su", "role": "teacher" }
        ]
    }
]

Hämta personligt schema

Förfrågan

> GET /v1/users/me/schedule?maxResults=10&startTime=ISO-timestamp&endTime=ISO-timestamp
> Authorization: Bearer <oauth 2 token>
> Accept: application/json

Stanardschema för event:

{
    "locations": [{ "room": "string" }],
    "name": "string",
    "eventType": "enum string",
    "startTime": "ISO-timestamp",
    "endTime": "ISO-timestamp",
    "details": {
        // beroende på eventType
        // courseEventType
        // bookingEventType
        // etc
    }
}

EventType (string, enum):

Value Description
teaching Undervisning
room booking Bokningar av rum
deadline Deadline
workshop Workshop

NOTE: Varför inkluderade vi workshop?

Details-objekt beroende på eventType:

{
    "courseEventType": {
        "courseCode": "string",
        "occasionId": "string",
        "semester": "string",
        "type": "enum string", // teaching, exam, deadline etc
        "shortname": "string",
        "description": "string",
        "participants": [{ "principal": "string" }]
    },
    "bookingEventType": {
        "identifier": "string",
        "description": "string",
        "organizer": { "name": "string", "principal": "string" },
        "type": "enum string", // in-person, online, hybrid
        "participants": [{ "principal": "string" }]
    },
    "deadlineEventType": {
        "description": "string",
        "relatedTo": { "type": "enum string", "identifier": "string" } // course, booking, other
    },
    "workshopEventType": {
        "description": "string",
        "type": "enum string", // in-person, online, hybrid
        "participants": [{ "principal": "string" }]
    }
}

Exempel

[
    {
        "locations": [{ "room": "L30" }],
        "name": "Föreläsning 1",
        "eventType": "teaching",
        "startTime": "2025-01-03T10:00:00Z",
        "endTime": "2025-01-03T12:00:00Z",
        "details": {
            "courseCode": "PROLED",
            "occasionId": 123456,
            "semester": "VT2025",
            "type": "Undervisning",
            "shortname": "F1",
            "description": "Lecture on API Design",
            "participants": [{ "principal": "teacher1@su" }, { "principal": "teacher2@su" }]
        }
    },
    {
        "locations": [{ "room": "G10:3" }],
        "name": "Gruppmöte",
        "eventType": "room booking",
        "startTime": "2025-01-03T09:00:00Z",
        "endTime": "2025-01-03T10:00:00Z",
        "details": {
            "identifier": "booking-12345",
            "description": "Group Meeting",
            "organizer": { "name": "Student 1", "principal": "student1@su" },
            "description": "Discuss project progress",
            "participants": [{ "principal": "student1@su" }, { "principal": "student2@su" }]
        }
    },
    {
        "locations": [{ "room": "L50" }],
        "name": "Workshop 1",
        "eventType": "workshop",
        "startTime": "2025-01-03T09:00:00Z",
        "endTime": "2025-01-03T10:00:00Z",
        "details": {
            "description": "Prepare a presentation",
            "type": "In-Person",
            "participants": [{ "principal": "teacher1@su" }, { "principal": "teacher2@su" }]
        }
    },
    {
        "locations": [{ "room": "G10:4" }],
        "name": "Tentaplugg",
        "eventType": "room booking",
        "startTime": "2025-01-03T09:00:00Z",
        "endTime": "2025-01-03T10:00:00Z",
        "details": {
            "description": "Tentaplugg - Don't forget the snacks",
            "type": "In-Person",
            "participants": [{ "principal": "student1@su" }, { "principal": "student2@su" }]
        }
    }
]