Skip to content

Commit

Permalink
updated api response, fixed height issues, made weather widget bigger…
Browse files Browse the repository at this point in the history
… on smaller screens
  • Loading branch information
smegg99 committed Oct 31, 2024
1 parent 5d94ffe commit cd2ff8e
Show file tree
Hide file tree
Showing 23 changed files with 640 additions and 305 deletions.
12 changes: 3 additions & 9 deletions api/v1/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ import (
"smuggr.xyz/optivum-bsf/common/config"
"smuggr.xyz/optivum-bsf/common/models"

"github.com/gin-gonic/gin"
"github.com/gin-contrib/gzip"
"github.com/gin-gonic/gin"
)

var DefaultRouter *gin.Engine
Expand All @@ -24,19 +24,13 @@ func Initialize(scheduleChannels *models.ScheduleChannels) (chan error) {
gin.SetMode(os.Getenv("GIN_MODE"))

DefaultRouter = gin.Default()
DefaultRouter.Use(gzip.Gzip(gzip.DefaultCompression))
DefaultRouter.Use(func(c *gin.Context) {
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
c.Writer.Header().Set("Access-Control-Allow-Origin", "http://localhost:3000")
c.Writer.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")
c.Writer.Header().Set("Access-Control-Allow-Headers", "Origin, Content-Type, X-Auth-Token")

if c.Request.Method == "OPTIONS" {
c.AbortWithStatus(204)
return
}

c.Next()
})
DefaultRouter.Use(gzip.Gzip(gzip.DefaultCompression))

routes.Initialize(DefaultRouter, scheduleChannels)

Expand Down
6 changes: 3 additions & 3 deletions api/v1/handlers/schedule.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ func GetDivisionHandler(c *gin.Context) {
}

func GetDivisionsHandler(c *gin.Context) {
Respond(c, http.StatusOK, scraper.DivisionsScraperResource.Designators.GetDesignators())
Respond(c, http.StatusOK, scraper.DivisionsScraperResource.Metadata)
}

func GetTeacherHandler(c *gin.Context) {
Expand Down Expand Up @@ -78,7 +78,7 @@ func GetTeacherHandler(c *gin.Context) {
}

func GetTeachersHandler(c *gin.Context) {
Respond(c, http.StatusOK, scraper.TeachersScraperResource.Designators.GetDesignators())
Respond(c, http.StatusOK, scraper.TeachersScraperResource.Metadata)
}

func GetRoomHandler(c *gin.Context) {
Expand Down Expand Up @@ -112,5 +112,5 @@ func GetRoomHandler(c *gin.Context) {
}

func GetRoomsHandler(c *gin.Context) {
Respond(c, http.StatusOK, scraper.RoomsScraperResource.Designators.GetDesignators())
Respond(c, http.StatusOK, scraper.RoomsScraperResource.Metadata)
}
8 changes: 4 additions & 4 deletions api/v1/routes/routes.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,18 @@ import (
"smuggr.xyz/optivum-bsf/common/models"
"smuggr.xyz/optivum-bsf/api/v1/handlers"

"github.com/didip/tollbooth"
"github.com/didip/tollbooth_gin"
//"github.com/didip/tollbooth"
//"github.com/didip/tollbooth_gin"
"github.com/gin-contrib/static"
"github.com/gin-gonic/gin"
)

func Initialize(defaultRouter *gin.Engine, scheduleChannels *models.ScheduleChannels) {
defaultLimiter := tollbooth.NewLimiter(1, nil)
//defaultLimiter := tollbooth.NewLimiter(0.5, nil)
defaultRouter.Use(static.Serve("/", static.LocalFile(os.Getenv("DIST_PATH"), false)))

rootGroup := defaultRouter.Group("/api/v1")
rootGroup.Use(tollbooth_gin.LimitHandler(defaultLimiter))
//rootGroup.Use(tollbooth_gin.LimitHandler(defaultLimiter))

handlers.Initialize()

Expand Down
348 changes: 188 additions & 160 deletions common/models/data.pb.go

Large diffs are not rendered by default.

5 changes: 4 additions & 1 deletion core/hub/hub.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,10 +78,13 @@ func (h *Hub) GetObserver(index int64) *observer.Observer {
return h.observers[index]
}

func (h *Hub) GetAllObservers() map[int64]*observer.Observer {
func (h *Hub) GetAllObservers(ignoreFirst bool) map[int64]*observer.Observer {
h.mu.RLock()
defer h.mu.RUnlock()
copyMap := make(map[int64]*observer.Observer, len(h.observers))
if ignoreFirst {
delete(copyMap, 0)
}
for k, v := range h.observers {
copyMap[k] = v
}
Expand Down
58 changes: 55 additions & 3 deletions core/scraper/helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"fmt"
"strconv"
"strings"
"sync"
"time"

"smuggr.xyz/optivum-bsf/common/models"
Expand All @@ -26,6 +27,43 @@ func makeRoomEndpoint(index int64) string {
return fmt.Sprintf(Config.Endpoints.Room, index)
}

func waitForFirstRefresh() {
var wg sync.WaitGroup

divisionObservers := len(DivisionsScraperResource.Hub.GetAllObservers(true))
teacherObservers := len(TeachersScraperResource.Hub.GetAllObservers(true))
roomObservers := len(RoomsScraperResource.Hub.GetAllObservers(true))

totalObservers := divisionObservers + teacherObservers + roomObservers
wg.Add(totalObservers)

waitForRefresh := func(ch <-chan int64, count int) {
for i := 0; i <= count; i++ {
go func() {
<-ch
wg.Done()
}()
}
}

waitForRefresh(DivisionsScraperResource.RefreshChan, divisionObservers)
waitForRefresh(TeachersScraperResource.RefreshChan, teacherObservers)
waitForRefresh(RoomsScraperResource.RefreshChan, roomObservers)

done := make(chan struct{})
go func() {
wg.Wait()
close(done)
}()

// Some observers may not refresh so we
// need to wait for a certain amount of time
select {
case <-done:
case <-time.After(15 * time.Second):
}
}

func splitDivisionTitle(s string) (string, string) {
parts := strings.Split(s, " ")
if len(parts) < 2 {
Expand Down Expand Up @@ -173,13 +211,27 @@ func scrapeTeacherTitle(doc *goquery.Document) (string, string, error) {
return designator, fullName, nil
}

func scrapeRoomTitle(doc *goquery.Document) (string, error) {
func splitRoomTitle(s string) (string, string) {
parts := strings.SplitN(s, " ", 2)
if len(parts) == 0 {
return "", ""
}
designator := strings.TrimSpace(parts[0])
var fullName string
if len(parts) > 1 {
fullName = strings.TrimSpace(parts[1])
}
return designator, fullName
}

func scrapeRoomTitle(doc *goquery.Document) (string, string, error) {
title, err := scrapeTitle(doc)
if err != nil {
return "", fmt.Errorf("error scraping title: %w", err)
return "", "", fmt.Errorf("error scraping title: %w", err)
}
designator, fullName := splitRoomTitle(title)

return title, nil
return designator, fullName, nil
}

func scrapeSchedule(doc *goquery.Document) (*models.Schedule, error) {
Expand Down
62 changes: 37 additions & 25 deletions core/scraper/scraper.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ func (t ResourceType) String() string {

type ScraperResource struct {
Indexes []int64
Designators *models.Designators
Metadata *models.Metadata
Observer *observer.Observer
Hub *hub.Hub
IndexRegex *regexp.Regexp
Expand All @@ -45,7 +45,10 @@ type ScraperResource struct {
func NewScraperResource(indexRegex *regexp.Regexp, resourceType ResourceType) *ScraperResource {
return &ScraperResource{
Indexes: []int64{},
Designators: &models.Designators{Designators: make(map[string]int64)},
Metadata: &models.Metadata{
Designators: make(map[string]int64),
FullNames: make(map[string]int64),
},
Observer: &observer.Observer{},
Hub: &hub.Hub{},
IndexRegex: indexRegex,
Expand All @@ -67,36 +70,44 @@ func (s *ScraperResource) StopHub() {
}
}

func (s *ScraperResource) UpdateDesignator(newDesignator string, index int64) {
func (s *ScraperResource) UpdateMetadata(newDesignator, newFullName string, index int64) {
s.Mu.Lock()
defer s.Mu.Unlock()
for _designator, _index := range s.Designators.Designators {
for _designator, _index := range s.Metadata.Designators {
if index == _index {
delete(s.Designators.Designators, _designator)
delete(s.Metadata.Designators, _designator)
}
}
s.Designators.Designators[newDesignator] = index
s.Metadata.Designators[newDesignator] = index

for _full_name, _index := range s.Metadata.FullNames {
if index == _index {
delete(s.Metadata.FullNames, _full_name)
}
}
s.Metadata.FullNames[newFullName] = index
}

func (s *ScraperResource) RemoveDesignator(index int64) {
func (s *ScraperResource) RemoveMetadata(index int64) {
s.Mu.Lock()
defer s.Mu.Unlock()
for designator, _index := range s.Designators.Designators {
for designator, _index := range s.Metadata.Designators {
if index == _index {
delete(s.Designators.Designators, designator)
delete(s.Metadata.Designators, designator)
if len(s.Metadata.Designators) == 0 {
break
}
}
}

s.Mu.Lock()
for key, _index := range s.Designators.Designators {
if _index == index {
delete(s.Designators.Designators, key)
if len(s.Designators.Designators) == 0 {
for fullName, _index := range s.Metadata.FullNames {
if index == _index {
delete(s.Metadata.FullNames, fullName)
if len(s.Metadata.FullNames) == 0 {
break
}
}
}
s.Mu.Unlock()
}

func (s *ScraperResource) UpdateIndexes(indexes []int64) {
Expand Down Expand Up @@ -146,10 +157,7 @@ func (s *ScraperResource) RefreshObservers() {
}
}

observersCopy := s.Hub.GetAllObservers()
if len(observersCopy) > 0 {
delete(observersCopy, 0) // Remove the list observer
}
observersCopy := s.Hub.GetAllObservers(true)
for index := range observersCopy {
if !existingIndexes[index] {
fmt.Printf("deleting observer for resource (%s) %d\n", s.Type, index)
Expand All @@ -158,11 +166,11 @@ func (s *ScraperResource) RefreshObservers() {
fmt.Printf("error deleting resource (%s) from datastore: %v\n", s.Type, err)
}

s.RemoveDesignator(index)
s.RemoveMetadata(index)
}
}

fmt.Printf("observing resource (%s) with %d observer(s)...\n", s.Type, len(s.Hub.GetAllObservers()))
fmt.Printf("observing resource (%s) with %d observer(s)...\n", s.Type, len(s.Hub.GetAllObservers(false)))
}

var (
Expand Down Expand Up @@ -198,7 +206,7 @@ func ScrapeDivision(index int64) (*models.Division, error) {
division.Designator = designator
division.FullName = fullName

DivisionsScraperResource.UpdateDesignator(designator, index)
DivisionsScraperResource.UpdateMetadata(designator, fullName, index)

schedule, err := scrapeSchedule(doc)
if err != nil {
Expand Down Expand Up @@ -230,7 +238,7 @@ func ScrapeTeacher(index int64) (*models.Teacher, error) {
teacher.Designator = designator
teacher.FullName = fullName

TeachersScraperResource.UpdateDesignator(designator, index)
TeachersScraperResource.UpdateMetadata(designator, fullName, index)

schedule, err := scrapeSchedule(doc)
if err != nil {
Expand All @@ -251,16 +259,18 @@ func ScrapeRoom(index int64) (*models.Room, error) {
room := models.Room{
Index: index,
Designator: "",
FullName: "",
Schedule: &models.Schedule{},
}

designator, err := scrapeRoomTitle(doc)
designator, fullName, err := scrapeRoomTitle(doc)
if err != nil {
return nil, fmt.Errorf("error scraping division title: %w", err)
}
room.Designator = designator
room.FullName = fullName

RoomsScraperResource.UpdateDesignator(designator, index)
RoomsScraperResource.UpdateMetadata(designator, fullName, index)

schedule, err := scrapeSchedule(doc)
if err != nil {
Expand Down Expand Up @@ -419,6 +429,8 @@ func Initialize() error {
ObserveTeachers(&TeachersScraperResource.RefreshChan)
ObserveRooms(&RoomsScraperResource.RefreshChan)

waitForFirstRefresh()

return nil
}

Expand Down
6 changes: 4 additions & 2 deletions data.proto
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,9 @@ message APIResponse {
string message = 2;
}

message Designators {
message Metadata {
map<string, int64> designators = 1;
map<string, int64> full_names = 2;
}

message Condition {
Expand Down Expand Up @@ -90,7 +91,8 @@ message Teacher {
message Room {
int64 index = 1;
string designator = 2;
Schedule schedule = 3;
string full_name = 3;
Schedule schedule = 4;
}

message Division {
Expand Down
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ require (
github.com/dustin/go-humanize v1.0.0 // indirect
github.com/fsnotify/fsnotify v1.7.0 // indirect
github.com/gabriel-vasile/mimetype v1.4.3 // indirect
github.com/gin-contrib/cors v1.7.2 // indirect
github.com/gin-contrib/sse v0.1.0 // indirect
github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect
Expand Down
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@ github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nos
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0=
github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk=
github.com/gin-contrib/cors v1.7.2 h1:oLDHxdg8W/XDoN/8zamqk/Drgt4oVZDvaV0YmvVICQw=
github.com/gin-contrib/cors v1.7.2/go.mod h1:SUJVARKgQ40dmrzgXEVxj2m7Ig1v1qIboQkPDTQ9t2E=
github.com/gin-contrib/gzip v1.0.1 h1:HQ8ENHODeLY7a4g1Au/46Z92bdGFl74OhxcZble9WJE=
github.com/gin-contrib/gzip v1.0.1/go.mod h1:njt428fdUNRvjuJf16tZMYZ2Yl+WQB53X5wmhDwXvC4=
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
Expand Down
1 change: 1 addition & 0 deletions web/optivum-better-schedule-frontend/components.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ declare module 'vue' {
Clock: typeof import('./src/components/clock/Clock.vue')['default']
copy: typeof import('./src/components/HelloWorld copy.vue')['default']
Digit: typeof import('./src/components/clock/Digit.vue')['default']
Division: typeof import('./src/components/pages/Division.vue')['default']
DivisionButton: typeof import('./src/components/DivisionButton.vue')['default']
Divisions: typeof import('./src/components/pages/Divisions.vue')['default']
Dots: typeof import('./src/components/Dots.vue')['default']
Expand Down
Loading

0 comments on commit cd2ff8e

Please sign in to comment.