Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,15 @@ dist/

# gon
unused.*.zip

# python
venv

# jetbrains ides
.idea

# misc
*.pdf

# macOS
.DS_Store
2 changes: 1 addition & 1 deletion .tool-versions
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
golang 1.20.2
golang 1.25.1
golangci-lint 1.52.0
mockery 2.12.0
11 changes: 9 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,8 +1,15 @@
build:
go build -o classeviva -v entrypoints/cli/main.go

mocks:
mockery --dir adapters/spaggiari --name LoaderStorer --name Fetcher --name Adapter
mock:
mockery --dir adapters/spaggiari --name AgendaReceiver
mockery --dir adapters/spaggiari --name Client
mockery --dir adapters/spaggiari --name Fetcher
mockery --dir adapters/spaggiari --name GradesReceiver
mockery --dir adapters/spaggiari --name HTTPClient
mockery --dir adapters/spaggiari --name LoaderStorer
mockery --dir adapters/spaggiari --name NoticeboardsReceiver

mockery --dir commands --name Command

test:
Expand Down
87 changes: 80 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,32 @@

Classeviva is a Go library and CLI tool to access the popular school portal https://web.spaggiari.eu.

## Grades
## CLI Commands

Text output:
### Version

Display the application version:

```shell
$ classeviva version
Classeviva CLI v0.0.0 (123) 2022-05-08 by zmoog
```

JSON output:

```shell
$ classeviva version --format json
{
"version": "v0.0.0",
"commit": "123",
"date": "2022-05-08",
"builtBy": "zmoog"
}
```

### Grades

List student grades with optional limit:

```text
$ classeviva grades list --limit 3
Expand All @@ -14,7 +37,7 @@ $ classeviva grades list --limit 3
| 2022-04-27 | 9 | ARTE E IMMAGINE | |
| 2022-04-22 | 7+ | COMPORTAMENTO | comportamento della settimana |
| | 7 | SCIENZE | |
+------------+-------+-----------------+-------------------------------+%
+------------+-------+-----------------+-------------------------------+
```

JSON output:
Expand All @@ -33,9 +56,9 @@ $ classeviva grades list --limit 1 --format json
]
```

## Agenda
### Agenda

Text output:
List agenda items (homework, events) with optional date range and limit:

```text
$ classeviva agenda list --limit 2
Expand All @@ -49,8 +72,8 @@ $ classeviva agenda list --limit 2

JSON output:

```text
$ classeviva agenda list --until 2022-04-27 --limit 2
```shell
$ classeviva agenda list --until 2022-04-27 --limit 2 --format json
[
{
"evtId": 546249,
Expand All @@ -72,3 +95,53 @@ $ classeviva agenda list --until 2022-04-27 --limit 2
}
]
```

### Noticeboards

List school announcements and circulars:

```text
$ classeviva noticeboards list
+---------------------+------+---------------------------------------+
| PUBLICATIONDATE | READ | TITLE |
+---------------------+------+---------------------------------------+
| 2022-04-28T10:30:00 | true | Comunicazione assemblea di istituto |
| 2022-04-25T15:45:00 | false| Circolare n. 123 - Uscita anticipata |
+---------------------+------+---------------------------------------+
```

JSON output:

```shell
$ classeviva noticeboards list --format json
[
{
"pubId": 12345,
"cntTitle": "Comunicazione assemblea di istituto",
"readStatus": true,
"pubDT": "2022-04-28T10:30:00",
"evtCode": "CF",
"cntValidInRange": true,
"cntStatus": "active",
"cntCategory": "General",
"cntHasAttach": true,
"attachments": [
{
"fileName": "comunicazione.pdf",
"attachNum": 1
}
]
}
]
```

Download noticeboard attachments:

```shell
$ classeviva noticeboards download --publication_id 12345 --output-filename ./downloads
+----------------------------------+
| FILE |
+----------------------------------+
| ./downloads/12345-documento.pdf |
+----------------------------------+
```
143 changes: 0 additions & 143 deletions adapters/spaggiari/adapter.go

This file was deleted.

47 changes: 47 additions & 0 deletions adapters/spaggiari/agenda.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package spaggiari

import (
"encoding/json"
"time"
)

type AgendaReceiver interface {
List(since, until time.Time) ([]AgendaEntry, error)
}

type agendaReceiver struct {
Client SpaggiariClient
IdentityProvider Provider
}

func (r agendaReceiver) List(since, until time.Time) ([]AgendaEntry, error) {
identity, err := r.IdentityProvider.Get()
if err != nil {
return []AgendaEntry{}, err
}

_since := since.Format("20060102")
_until := until.Format("20060102")

url := baseUrl + "/students/" + identity.ID + "/agenda/all/" + _since + "/" + _until

entries := []AgendaEntry{}

err = r.Client.Get(url, func(body []byte) error {
envelope := map[string][]AgendaEntry{}

err := json.Unmarshal(body, &envelope)
if err != nil {
return err
}

entries = envelope["agenda"]

return nil
})
if err != nil {
return []AgendaEntry{}, err
}

return entries, nil
}
41 changes: 41 additions & 0 deletions adapters/spaggiari/grades.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package spaggiari

import "encoding/json"

type GradesReceiver interface {
List() ([]Grade, error)
}

type gradeReceiver struct {
Client SpaggiariClient
IdentityProvider Provider
}

func (r gradeReceiver) List() ([]Grade, error) {
identity, err := r.IdentityProvider.Get()
if err != nil {
return []Grade{}, err
}

url := baseUrl + "/students/" + identity.ID + "/grades"

grades := []Grade{}

err = r.Client.Get(url, func(body []byte) error {
envelope := map[string][]Grade{}

err := json.Unmarshal(body, &envelope)
if err != nil {
return err
}

grades = envelope["grades"]

return nil
})
if err != nil {
return []Grade{}, err
}

return grades, nil
}
Loading
Loading