Compare commits
3 commits
01901719e5
...
9b6da62bb1
Author | SHA1 | Date | |
---|---|---|---|
|
9b6da62bb1 | ||
|
aa7c403e60 | ||
|
39f9bccef4 |
13 changed files with 271 additions and 51 deletions
|
@ -1,7 +1,8 @@
|
||||||
# Custom Dictionary Words
|
# Custom Dictionary Words
|
||||||
skola
|
|
||||||
goskola
|
goskola
|
||||||
pubtypes
|
pubtypes
|
||||||
|
skola
|
||||||
|
xscope
|
||||||
|
zadachin
|
||||||
zervo
|
zervo
|
||||||
zervó
|
zervó
|
||||||
zadachin
|
|
|
@ -28,6 +28,8 @@ func main() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
terms, _ := api.GetTerms()
|
||||||
|
|
||||||
rooms, err := api.GetRooms(schools[4], true)
|
rooms, err := api.GetRooms(schools[4], true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err.Error())
|
fmt.Println(err.Error())
|
||||||
|
@ -56,4 +58,11 @@ func main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Println(key)
|
fmt.Println(key)
|
||||||
|
|
||||||
|
schedule, err := api.GetWeekSchedule(2024, 50, schools[4], terms.ActiveTerms[0], classes[0])
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println(schedule)
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,26 +33,37 @@ type Skola24API struct {
|
||||||
Host string
|
Host string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get all available terms (aka semesters) from the active host/domain
|
||||||
func (api Skola24API) GetTerms() (_result pubtypes.Terms, _error error) {
|
func (api Skola24API) GetTerms() (_result pubtypes.Terms, _error error) {
|
||||||
return requests.GetTerms(api.Host)
|
return requests.GetTerms(api.Host)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get all available schools from the active host/domain
|
||||||
func (api Skola24API) GetSchools() (_result []pubtypes.School, _error error) {
|
func (api Skola24API) GetSchools() (_result []pubtypes.School, _error error) {
|
||||||
return requests.GetSchools(api.Host)
|
return requests.GetSchools(api.Host)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get all available rooms from a school
|
||||||
func (api Skola24API) GetRooms(school pubtypes.School, checkAvailability bool) (_result []pubtypes.Room, _error error) {
|
func (api Skola24API) GetRooms(school pubtypes.School, checkAvailability bool) (_result []pubtypes.Room, _error error) {
|
||||||
return requests.GetRooms(school, checkAvailability)
|
return requests.GetRooms(school, checkAvailability)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get all available teachers from a school
|
||||||
func (api Skola24API) GetTeachers(school pubtypes.School, checkAvailability bool) (_result []pubtypes.Teacher, _error error) {
|
func (api Skola24API) GetTeachers(school pubtypes.School, checkAvailability bool) (_result []pubtypes.Teacher, _error error) {
|
||||||
return requests.GetTeachers(school, checkAvailability)
|
return requests.GetTeachers(school, checkAvailability)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get all available students from a school (EXPERIMENTAL)
|
||||||
func (api Skola24API) GetStudents(school pubtypes.School, checkAvailability bool) (_result any, _error error) {
|
func (api Skola24API) GetStudents(school pubtypes.School, checkAvailability bool) (_result any, _error error) {
|
||||||
return requests.GetStudents(school, checkAvailability)
|
return requests.GetStudents(school, checkAvailability)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get all available classes from a school
|
||||||
func (api Skola24API) GetClasses(school pubtypes.School, checkAvailability bool) (_result []pubtypes.Class, _error error) {
|
func (api Skola24API) GetClasses(school pubtypes.School, checkAvailability bool) (_result []pubtypes.Class, _error error) {
|
||||||
return requests.GetClasses(school, checkAvailability)
|
return requests.GetClasses(school, checkAvailability)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get a week schedule for the provided date, school, term and class
|
||||||
|
func (api Skola24API) GetWeekSchedule(year int, week int, school pubtypes.School, term pubtypes.SchoolTerm, class pubtypes.Class) (_result any, _error error) {
|
||||||
|
return requests.GetSchedule(year, week, 0, school, term, class)
|
||||||
|
}
|
||||||
|
|
89
internal/requests/get_schedule.go
Normal file
89
internal/requests/get_schedule.go
Normal file
|
@ -0,0 +1,89 @@
|
||||||
|
/*
|
||||||
|
GoSkola24API
|
||||||
|
Copyright (C) 2024, Zervó Zadachin
|
||||||
|
|
||||||
|
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Affero General Public License version 3
|
||||||
|
as published by the Free Software Foundation.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Affero General Public License version 3 for more details.
|
||||||
|
|
||||||
|
This program incorporates external libraries for certain functionalities.
|
||||||
|
These libraries are covered by their respective licenses, and their usage
|
||||||
|
agreements are as outlined in their respective documentation or source
|
||||||
|
code.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package requests
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"git.zervo.org/zervo/goskola24api/internal/types"
|
||||||
|
"git.zervo.org/zervo/goskola24api/internal/utility"
|
||||||
|
|
||||||
|
pubtypes "git.zervo.org/zervo/goskola24api/types"
|
||||||
|
)
|
||||||
|
|
||||||
|
func GetSchedule(year int, week int, day int, school pubtypes.School, term pubtypes.SchoolTerm, class pubtypes.Class) (_result any, _error error) {
|
||||||
|
// Verify week number
|
||||||
|
if week > 52 || week < 1 {
|
||||||
|
return nil, errors.New("week number out of range (1-53): " + fmt.Sprint(week))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verify year
|
||||||
|
if year > 9999 || year < 2000 {
|
||||||
|
return nil, errors.New("year number out of range (2000-9999): " + fmt.Sprint(year))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verify day
|
||||||
|
if day > 7 || day < 0 {
|
||||||
|
return nil, errors.New("day number out of range (0-7): " + fmt.Sprint(day))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get render key
|
||||||
|
renderKey, err := utility.GetRendererKey()
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.New("failed to get render key: " + err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
// Construct request
|
||||||
|
request := types.RequestSchedule{
|
||||||
|
RenderKey: renderKey,
|
||||||
|
Host: school.HostName,
|
||||||
|
UnitGuid: school.SchoolId,
|
||||||
|
StartDate: nil,
|
||||||
|
EndDate: nil,
|
||||||
|
ScheduleDay: day,
|
||||||
|
BlackAndWhite: false,
|
||||||
|
Width: 1000,
|
||||||
|
Height: 1000,
|
||||||
|
SelectionType: 0,
|
||||||
|
Selection: class.ClassId,
|
||||||
|
ShowHeader: false,
|
||||||
|
PeriodText: "",
|
||||||
|
Week: week,
|
||||||
|
Year: year,
|
||||||
|
SchoolYear: term.TermId,
|
||||||
|
PersonalTimetable: false,
|
||||||
|
PrivateFreeTextMode: nil,
|
||||||
|
PrivateSelectionMode: false,
|
||||||
|
CustomerKey: "",
|
||||||
|
}
|
||||||
|
|
||||||
|
response, err := utility.Request(request, "render/timetable")
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.New("could not get schedule data: " + err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
return response, nil
|
||||||
|
}
|
48
internal/types/req_schedule.go
Normal file
48
internal/types/req_schedule.go
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
/*
|
||||||
|
GoSkola24API
|
||||||
|
Copyright (C) 2024, Zervó Zadachin
|
||||||
|
|
||||||
|
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Affero General Public License version 3
|
||||||
|
as published by the Free Software Foundation.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Affero General Public License version 3 for more details.
|
||||||
|
|
||||||
|
This program incorporates external libraries for certain functionalities.
|
||||||
|
These libraries are covered by their respective licenses, and their usage
|
||||||
|
agreements are as outlined in their respective documentation or source
|
||||||
|
code.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package types
|
||||||
|
|
||||||
|
type RequestSchedule struct {
|
||||||
|
RenderKey string `json:"renderKey"`
|
||||||
|
Host string `json:"host"`
|
||||||
|
UnitGuid string `json:"unitGuid"`
|
||||||
|
StartDate *string `json:"startDate"`
|
||||||
|
EndDate *string `json:"endDate"`
|
||||||
|
ScheduleDay int `json:"scheduleDay"`
|
||||||
|
BlackAndWhite bool `json:"blackAndWhite"`
|
||||||
|
Width int `json:"width"`
|
||||||
|
Height int `json:"height"`
|
||||||
|
SelectionType int `json:"selectionType"`
|
||||||
|
Selection string `json:"selection"`
|
||||||
|
ShowHeader bool `json:"showHeader"`
|
||||||
|
PeriodText any `json:"periodText"`
|
||||||
|
Week int `json:"week"`
|
||||||
|
Year int `json:"year"`
|
||||||
|
SchoolYear string `json:"schoolYear"`
|
||||||
|
PersonalTimetable bool `json:"personalTimetable"`
|
||||||
|
PrivateFreeTextMode *string `json:"privateFreeTextMode"`
|
||||||
|
PrivateSelectionMode bool `json:"privateSelectionMode"`
|
||||||
|
CustomerKey string `json:"customerKey"`
|
||||||
|
}
|
|
@ -25,10 +25,19 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
package types
|
package types
|
||||||
|
|
||||||
type BaseResponse struct {
|
type BaseResponse struct {
|
||||||
Error interface{} `json:"error"`
|
Error interface{} `json:"error"`
|
||||||
Data interface{} `json:"data"`
|
Data interface{} `json:"data"`
|
||||||
Exception interface{} `json:"exception"`
|
Exception *ResponseError `json:"exception"`
|
||||||
Validation []interface{} `json:"validation"`
|
Validation []interface{} `json:"validation"`
|
||||||
SessionExpires interface{} `json:"sessionExpires"`
|
SessionExpires interface{} `json:"sessionExpires"`
|
||||||
NeedSessionRefresh bool `json:"needSessionRefresh"`
|
NeedSessionRefresh bool `json:"needSessionRefresh"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ResponseError struct {
|
||||||
|
Code int `json:"code"`
|
||||||
|
Context string `json:"context"`
|
||||||
|
ErrorId int `json:"errorId"`
|
||||||
|
ErrorTime string `json:"errorTime"`
|
||||||
|
Message *string `json:"message"`
|
||||||
|
Source any `json:"source"`
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,6 +71,16 @@ func Request(data any, endpoint string) (_response interface{}, _error error) {
|
||||||
var responseData types.BaseResponse
|
var responseData types.BaseResponse
|
||||||
json.Unmarshal(bodyBytes, &responseData)
|
json.Unmarshal(bodyBytes, &responseData)
|
||||||
|
|
||||||
|
// Check for reported exceptions
|
||||||
|
if responseData.Exception != nil {
|
||||||
|
return nil, errors.New("server replied with an exception")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for reported errors
|
||||||
|
if responseData.Error != nil {
|
||||||
|
return nil, errors.New("server replied with an error")
|
||||||
|
}
|
||||||
|
|
||||||
// Return as raw bytes (let consumer do type assertion)
|
// Return as raw bytes (let consumer do type assertion)
|
||||||
return responseData.Data, nil
|
return responseData.Data, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,17 +24,18 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
package types
|
package types
|
||||||
|
|
||||||
|
// Holds data about a class, which is usually a group of people studying a subject together
|
||||||
type Class struct {
|
type Class struct {
|
||||||
Name string `json:"name"`
|
Name string `json:"name"` // Friendly-name of the class
|
||||||
ClassId string `json:"classId"`
|
ClassId string `json:"classId"` // UUID identifying the class
|
||||||
AbsenceMessageNotDeliveredCount int `json:"absenceMessageNotDeliveredCount"`
|
AbsenceMessageNotDeliveredCount int `json:"absenceMessageNotDeliveredCount"` // Purpose unknown
|
||||||
IsResponsible bool `json:"isResponsible"`
|
IsResponsible bool `json:"isResponsible"` // Purpose unknown
|
||||||
IsClass bool `json:"isClass"`
|
IsClass bool `json:"isClass"` // Purpose unknown
|
||||||
IsAdmin bool `json:"isAdmin"`
|
IsAdmin bool `json:"isAdmin"` // Purpose unknown
|
||||||
IsPrincipal bool `json:"isPrincipal"`
|
IsPrincipal bool `json:"isPrincipal"` // Purpose unknown
|
||||||
IsMentor bool `json:"isMentor"`
|
IsMentor bool `json:"isMentor"` // Purpose unknown
|
||||||
IsPreschoolGroup bool `json:"isPreschoolGroup"`
|
IsPreschoolGroup bool `json:"isPreschoolGroup"` // Purpose unknown
|
||||||
Teachers any `json:"teachers"` // TODO: MAKE TYPED
|
Teachers any `json:"teachers"` // Teachers for the class. TODO: MAKE TYPED
|
||||||
SubstituteTeacherId string `json:"substituteTeacherId"`
|
SubstituteTeacherId string `json:"substituteTeacherId"` // Teacher ID of the substitute teacher, if any
|
||||||
TeacherChangeStudents int `json:"teacherChangeStudents"`
|
TeacherChangeStudents int `json:"teacherChangeStudents"` // Purpose unknown
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,8 +24,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
package types
|
package types
|
||||||
|
|
||||||
|
// Holds data about a room; a physical location within a school
|
||||||
type Room struct {
|
type Room struct {
|
||||||
Name string `json:"name"`
|
Name string `json:"name"` // Name describing the room
|
||||||
RoomId string `json:"roomId"`
|
RoomId string `json:"roomId"` // UUID identifying the room
|
||||||
External bool `json:"external"`
|
External bool `json:"external"` // Whether or not the room is external (purpose unknown)
|
||||||
}
|
}
|
||||||
|
|
36
types/schedules.go
Normal file
36
types/schedules.go
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
/*
|
||||||
|
GoSkola24API
|
||||||
|
Copyright (C) 2024, Zervó Zadachin
|
||||||
|
|
||||||
|
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Affero General Public License version 3
|
||||||
|
as published by the Free Software Foundation.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Affero General Public License version 3 for more details.
|
||||||
|
|
||||||
|
This program incorporates external libraries for certain functionalities.
|
||||||
|
These libraries are covered by their respective licenses, and their usage
|
||||||
|
agreements are as outlined in their respective documentation or source
|
||||||
|
code.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package types
|
||||||
|
|
||||||
|
import "time"
|
||||||
|
|
||||||
|
// Holds data about a lesson, usually occurring once a week
|
||||||
|
type Lesson struct {
|
||||||
|
LessonId string `json:"lessonId"` // UUID identifying the lesson
|
||||||
|
DayOfWeek int `json:"dayOfWeek"` // Day of the week where lesson occurs (monday=1)
|
||||||
|
Start time.Time `json:"start"` // Time when the lesson starts
|
||||||
|
End time.Time `json:"end"` // Time when the lesson ends
|
||||||
|
Texts []string `json:"texts"` // Extra texts that may be displayed on a timetable
|
||||||
|
}
|
|
@ -24,21 +24,23 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
package types
|
package types
|
||||||
|
|
||||||
|
// Holds data about a school
|
||||||
type School struct {
|
type School struct {
|
||||||
Name string `json:"name"`
|
Name string `json:"name"` // Friendly-name of the school
|
||||||
SchoolId string `json:"schoolId"`
|
SchoolId string `json:"schoolId"` // UUID identifying the school
|
||||||
HostName string `json:"hostName"`
|
HostName string `json:"hostName"` // The hostname (domain) that the school belongs to
|
||||||
AllowCalendarExport bool `json:"allowCalendarExport"`
|
AllowCalendarExport bool `json:"allowCalendarExport"` // Whether traditional calendar export is allowed, does not affect this module
|
||||||
AvailableData DataAvailability `json:"availableData"`
|
AvailableData DataAvailability `json:"availableData"` // The types of data that the school provides
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Defines data availability, showing what type of data can be retrieved from an entity
|
||||||
type DataAvailability struct {
|
type DataAvailability struct {
|
||||||
HasClasses bool `json:"hasClasses"`
|
HasClasses bool `json:"hasClasses"` // Whether the school provides class data
|
||||||
HasCourses bool `json:"hasCourses"`
|
HasCourses bool `json:"hasCourses"` // Whether the school provides course data
|
||||||
HasGroups bool `json:"hasGroups"`
|
HasGroups bool `json:"hasGroups"` // Whether the school provides group data
|
||||||
HasResources bool `json:"hasResources"`
|
HasResources bool `json:"hasResources"` // Whether the school provides resource data
|
||||||
HasRooms bool `json:"hasRooms"`
|
HasRooms bool `json:"hasRooms"` // Whether the school provides room data
|
||||||
HasStudents bool `json:"hasStudents"`
|
HasStudents bool `json:"hasStudents"` // Whether the school provides student data
|
||||||
HasSubjects bool `json:"hasSubjects"`
|
HasSubjects bool `json:"hasSubjects"` // Whether the school provides subject data
|
||||||
HasTeachers bool `json:"hasTeachers"`
|
HasTeachers bool `json:"hasTeachers"` // Whether the school provides teacher data
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,14 +24,15 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
package types
|
package types
|
||||||
|
|
||||||
|
// Holds data about a teacher
|
||||||
type Teacher struct {
|
type Teacher struct {
|
||||||
FirstName string `json:"firstName"`
|
FirstName string `json:"firstName"` // Teacher's first name
|
||||||
LastName string `json:"lastName"`
|
LastName string `json:"lastName"` // Teacher's last name
|
||||||
FullName string `json:"fullName"`
|
FullName string `json:"fullName"` // Teacher's full name, usually including their initials
|
||||||
FriendlyId string `json:"friendlyId"`
|
FriendlyId string `json:"friendlyId"` // Friendly-ID of the teacher, usually their initials
|
||||||
TeacherId string `json:"teacherId"`
|
TeacherId string `json:"teacherId"` // UUID identifying the teacher
|
||||||
IsActive bool `json:"isActive"`
|
IsActive bool `json:"isActive"` // Purpose unknown
|
||||||
Integrity bool `json:"integrity"`
|
Integrity bool `json:"integrity"` // Purpose unknown
|
||||||
Reported bool `json:"reported"`
|
Reported bool `json:"reported"` // Purpose unknown
|
||||||
ReadOnly bool `json:"readOnly"`
|
ReadOnly bool `json:"readOnly"` // Purpose unknown
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,14 +24,16 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
package types
|
package types
|
||||||
|
|
||||||
|
// Holds data about a school term, aka semester
|
||||||
type SchoolTerm struct {
|
type SchoolTerm struct {
|
||||||
Start string `json:"start"`
|
Start string `json:"start"` // Start-date of the term
|
||||||
TermId string `json:"termId"`
|
TermId string `json:"termId"` // UUID identifying the term
|
||||||
Name string `json:"name"`
|
Name string `json:"name"` // Friendly-name of the term
|
||||||
End string `json:"end"`
|
End string `json:"end"` // End-date of the term
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Holds a list of active school terms
|
||||||
type Terms struct {
|
type Terms struct {
|
||||||
ActiveTerms []SchoolTerm `json:"activeSchoolYears"`
|
ActiveTerms []SchoolTerm `json:"activeSchoolYears"` // List of active terms
|
||||||
UseSchoolYearsFeatures bool `json:"useSchoolYearsFeatures"`
|
UseSchoolYearsFeatures bool `json:"useSchoolYearsFeatures"` // Purpose unknown
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue