This commit is contained in:
2026-06-29 23:45:08 +07:00
parent 5290eeeb91
commit c736326162
15 changed files with 3067 additions and 388 deletions

View File

@@ -0,0 +1,199 @@
package qldt
import (
"context"
"encoding/json"
"fmt"
"io"
"net/http"
"net/url"
"strconv"
"strings"
"time"
)
type Client struct {
baseURL string
origin string
http *http.Client
}
func NewClient(baseURL, origin string) *Client {
baseURL = strings.TrimRight(baseURL, "/")
return &Client{
baseURL: baseURL,
origin: origin,
http: &http.Client{
Timeout: 45 * time.Second,
},
}
}
type StudentsResponse struct {
Message string `json:"message"`
StatusCode int `json:"statusCode"`
Data []StudentDTO `json:"data"`
Total int `json:"total"`
Page string `json:"page"`
PageSize string `json:"pageSize"`
}
type StudentDTO struct {
ID int64 `json:"id"`
StudentCode string `json:"studentCode"`
FullName string `json:"fullName"`
Phone *string `json:"phone"`
Email string `json:"email"`
DateOfBirth *string `json:"dateOfBirth"`
Gender *int `json:"gender"`
Status *string `json:"status"`
Location *string `json:"location"`
System *struct {
ID int64 `json:"id"`
Name string `json:"name"`
} `json:"system"`
}
type ClassesResponse struct {
Data []ClassDTO `json:"data"`
StatusCode int `json:"statusCode"`
}
type ClassDTO struct {
ID int64 `json:"id"`
Name string `json:"name"`
ClassCode string `json:"classCode"`
Type string `json:"type"`
StudentCount int `json:"studentCount"`
CreatedAt string `json:"createdAt"`
UpdatedAt *string `json:"updatedAt"`
Specializes *struct {
ID int64 `json:"id"`
Name string `json:"name"`
Systems *struct {
ID int64 `json:"id"`
SystemCode string `json:"systemCode"`
Name string `json:"name"`
} `json:"systems"`
} `json:"specializes"`
Courses []classCourseNestDTO `json:"courses"`
}
type classCourseNestDTO struct {
ID int64 `json:"id"`
Name string `json:"name"`
}
func (c *Client) GetStudents(ctx context.Context, token string, page, pageSize int) (*StudentsResponse, error) {
u, err := url.Parse(c.baseURL + "/students")
if err != nil {
return nil, err
}
q := u.Query()
q.Set("page", strconv.Itoa(page))
q.Set("pageSize", strconv.Itoa(pageSize))
u.RawQuery = q.Encode()
req, err := http.NewRequestWithContext(ctx, http.MethodGet, u.String(), nil)
if err != nil {
return nil, err
}
req.Header.Set("Authorization", "Bearer "+token)
if c.origin != "" {
req.Header.Set("Origin", c.origin)
req.Header.Set("Referer", c.origin+"/")
}
req.Header.Set("Accept", "application/json")
resp, err := c.http.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
if resp.StatusCode < 200 || resp.StatusCode >= 300 {
return nil, fmt.Errorf("qldt students http %d: %s", resp.StatusCode, string(body))
}
var out StudentsResponse
if err := json.Unmarshal(body, &out); err != nil {
return nil, err
}
if out.StatusCode != 0 && out.StatusCode != 200 {
return nil, fmt.Errorf("qldt statusCode %d: %s", out.StatusCode, out.Message)
}
return &out, nil
}
func (c *Client) GetClassesBySystem(ctx context.Context, token string, systemID int64) (*ClassesResponse, error) {
u := fmt.Sprintf("%s/classes/system/%d", c.baseURL, systemID)
req, err := http.NewRequestWithContext(ctx, http.MethodGet, u, nil)
if err != nil {
return nil, err
}
req.Header.Set("Authorization", "Bearer "+token)
if c.origin != "" {
req.Header.Set("Origin", c.origin)
req.Header.Set("Referer", c.origin+"/")
}
req.Header.Set("Accept", "application/json")
resp, err := c.http.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
if resp.StatusCode < 200 || resp.StatusCode >= 300 {
return nil, fmt.Errorf("qldt classes/system/%d http %d: %s", systemID, resp.StatusCode, string(body))
}
var outClasses ClassesResponse
if err := json.Unmarshal(body, &outClasses); err != nil {
return nil, err
}
if outClasses.StatusCode != 0 && outClasses.StatusCode != 200 {
return nil, fmt.Errorf("qldt classes statusCode %d", outClasses.StatusCode)
}
return &outClasses, nil
}
func (c *Client) GetClassDashboard(ctx context.Context, token string, classID, courseID int64) ([]byte, error) {
u := fmt.Sprintf("%s/classes/dashboard/%d/%d", c.baseURL, classID, courseID)
req, err := http.NewRequestWithContext(ctx, http.MethodGet, u, nil)
if err != nil {
return nil, err
}
req.Header.Set("Authorization", "Bearer "+token)
if c.origin != "" {
req.Header.Set("Origin", c.origin)
req.Header.Set("Referer", c.origin+"/")
}
req.Header.Set("Accept", "application/json")
resp, err := c.http.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
if resp.StatusCode < 200 || resp.StatusCode >= 300 {
return nil, fmt.Errorf("qldt classes/dashboard/%d/%d http %d: %s", classID, courseID, resp.StatusCode, string(body))
}
var probe struct {
StatusCode int `json:"statusCode"`
Message string `json:"message"`
}
if err := json.Unmarshal(body, &probe); err == nil {
if probe.StatusCode != 0 && probe.StatusCode != 200 {
return nil, fmt.Errorf("qldt classes/dashboard statusCode %d: %s", probe.StatusCode, probe.Message)
}
}
return body, nil
}