Skip to content

Commit

Permalink
feat: scrape board members
Browse files Browse the repository at this point in the history
  • Loading branch information
Topvennie committed Feb 21, 2025
1 parent 01de787 commit 08ac0ff
Show file tree
Hide file tree
Showing 31 changed files with 737 additions and 49 deletions.
1 change: 1 addition & 0 deletions config/development.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,4 @@ db:
website:
academicYears_s: 86400
events_s: 3600
boards_s: 86400
2 changes: 1 addition & 1 deletion db/migrations/20250218174229_add_academic_year_table.sql
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ ALTER TABLE event
DROP COLUMN academic_year;

ALTER TABLE event
ADD COLUMN academic_year VARCHAR(255) NOT NULL;
ADD COLUMN academic_year VARCHAR(255);

DROP TABLE IF EXISTS academic_year;
-- +goose StatementEnd
13 changes: 13 additions & 0 deletions db/migrations/20250221111128_add_member_table.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
-- +goose Up
-- +goose StatementBegin
CREATE TABLE IF NOT EXISTS member (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
username VARCHAR(255)
);
-- +goose StatementEnd

-- +goose Down
-- +goose StatementBegin
DROP TABLE IF EXISTS member;
-- +goose StatementEnd
16 changes: 16 additions & 0 deletions db/migrations/20250221115411_add_board_table.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
-- +goose Up
-- +goose StatementBegin
CREATE TABLE IF NOT EXISTS board (
id SERIAL PRIMARY KEY,
member INTEGER NOT NULL REFERENCES member (id),
academic_year INTEGER NOT NULL REFERENCES academic_year (id),
role VARCHAR(255) NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP
);
-- +goose StatementEnd

-- +goose Down
-- +goose StatementBegin
DROP TABLE IF EXISTS board;
-- +goose StatementEnd
13 changes: 13 additions & 0 deletions db/migrations/20250221122553_add_organizer_table.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
-- +goose Up
-- +goose StatementBegin
CREATE TABLE IF NOT EXISTS organizer (
id SERIAL PRIMARY KEY,
event INTEGER NOT NULL REFERENCES event (id),
board INTEGER NOT NULL REFERENCES board (id)
);
-- +goose StatementEnd

-- +goose Down
-- +goose StatementBegin
DROP TABLE IF EXISTS organizer;
-- +goose StatementEnd
2 changes: 0 additions & 2 deletions db/queries/academic_year.sql
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
-- CRUD

-- name: AcademicYearGetAll :many
SELECT * FROM academic_year
ORDER BY start_year DESC;
Expand Down
10 changes: 10 additions & 0 deletions db/queries/board.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
-- name: BoardGetAll :many
SELECT * FROM board b
INNER JOIN member m ON b.member = m.id
INNER JOIN academic_year a_y ON b.academic_year = a_y.id;

-- name: BoardCreate :one
INSERT INTO board (member, academic_year, role)
VALUES ($1, $2, $3)
RETURNING id;

2 changes: 0 additions & 2 deletions db/queries/event.sql
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
-- CRUD

-- name: EventGetAll :many
SELECT * FROM event;

Expand Down
13 changes: 13 additions & 0 deletions db/queries/member.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
-- name: MemberGetAll :many
SELECT * FROM member;

-- name: MemberCreate :one
INSERT INTO member (name, username)
VALUES ($1, $2)
RETURNING id;

-- name: MemberUpdate :exec
UPDATE member
SET name = $1, username = $2
WHERE id = $3;

12 changes: 12 additions & 0 deletions db/queries/organizer.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
-- name: OrganizerGetAllByEvent :many
SELECT * FROM organizer
WHERE event = $1;

-- name: OrganizerCreate :one
INSERT INTO organizer (event, board)
VALUES ($1, $2)
RETURNING id;

-- name: OrganizerDelete :exec
DELETE FROM organizer
WHERE id = $1;
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ module github.com/ZeusWPI/events
go 1.24.0

require (
github.com/PuerkitoBio/goquery v1.10.2
github.com/gocolly/colly v1.2.0
github.com/jackc/pgx/v5 v5.7.2
github.com/joho/godotenv v1.5.1
Expand All @@ -11,7 +12,6 @@ require (
)

require (
github.com/PuerkitoBio/goquery v1.10.2 // indirect
github.com/andybalholm/cascadia v1.3.3 // indirect
github.com/antchfx/htmlquery v1.3.4 // indirect
github.com/antchfx/xmlquery v1.4.4 // indirect
Expand Down
8 changes: 8 additions & 0 deletions internal/cmd/website.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,12 @@ func RunWebsitePeriodic(w *website.Website) {
task: func() error { return w.UpdateAllEvents() },
}
go eventsTask.run()

boardsTask := &periodicTask{
name: "update board members",
interval: time.Duration(config.GetDefaultInt("website.boards_s", 86400)) * time.Second,
done: make(chan bool),
task: func() error { return w.UpdateAllBoards() },
}
go boardsTask.run()
}
16 changes: 8 additions & 8 deletions internal/pkg/db/repository/academic_year.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@ import (
"fmt"

"github.com/ZeusWPI/events/internal/pkg/db/sqlc"
"github.com/ZeusWPI/events/internal/pkg/models"
"github.com/ZeusWPI/events/internal/pkg/model"
"github.com/ZeusWPI/events/pkg/db"
"github.com/ZeusWPI/events/pkg/util"
)

// AcademicYear provides all models.AcademicYear related database operations
// AcademicYear provides all model.AcademicYear related database operations
type AcademicYear interface {
GetAll() ([]*models.AcademicYear, error)
Save(*models.AcademicYear) error
GetAll() ([]*model.AcademicYear, error)
Save(*model.AcademicYear) error
}

type academicYearRepo struct {
Expand All @@ -24,14 +24,14 @@ type academicYearRepo struct {
var _ AcademicYear = (*academicYearRepo)(nil)

// GetAll returns all academic year in desc order according to start year
func (r *academicYearRepo) GetAll() ([]*models.AcademicYear, error) {
func (r *academicYearRepo) GetAll() ([]*model.AcademicYear, error) {
yearsDB, err := r.db.Queries().AcademicYearGetAll(context.Background())
if err != nil {
return nil, fmt.Errorf("Unable to get all academic years | %v", err)
}

return util.SliceMap(yearsDB, func(y sqlc.AcademicYear) *models.AcademicYear {
return &models.AcademicYear{
return util.SliceMap(yearsDB, func(y sqlc.AcademicYear) *model.AcademicYear {
return &model.AcademicYear{
ID: int(y.ID),
StartYear: int(y.StartYear),
EndYear: int(y.EndYear),
Expand All @@ -40,7 +40,7 @@ func (r *academicYearRepo) GetAll() ([]*models.AcademicYear, error) {
}

// Save creates a new academic year or updates an existing one
func (r *academicYearRepo) Save(a *models.AcademicYear) error {
func (r *academicYearRepo) Save(a *model.AcademicYear) error {
var id int32
var err error

Expand Down
94 changes: 94 additions & 0 deletions internal/pkg/db/repository/board.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
package repository

import (
"context"
"fmt"

"github.com/ZeusWPI/events/internal/pkg/db/sqlc"
"github.com/ZeusWPI/events/internal/pkg/model"
"github.com/ZeusWPI/events/pkg/db"
"github.com/ZeusWPI/events/pkg/util"
)

// Board provides all model.Board related database operations
type Board interface {
GetAll() ([]*model.Board, error)
Save(*model.Board) error
}

type boardRepo struct {
db db.DB

year AcademicYear
member Member
}

// Interface compliance
var _ Board = (*boardRepo)(nil)

// GetAll returns all boards
func (r *boardRepo) GetAll() ([]*model.Board, error) {
boards, err := r.db.Queries().BoardGetAll(context.Background())
if err != nil {
return nil, fmt.Errorf("Unable to get all boards | %v", err)
}

return util.SliceMap(boards, func(b sqlc.BoardGetAllRow) *model.Board {
username := ""
if b.Username.Valid {
username = b.Username.String
}

return &model.Board{
ID: int(b.ID),
Member: model.Member{
ID: int(b.ID_2),
Name: b.Name,
Username: username,
},
AcademicYear: model.AcademicYear{
ID: int(b.ID_3),
StartYear: int(b.StartYear),
EndYear: int(b.EndYear),
},
Role: b.Role,
}
}), nil
}

// Save creates a new board
func (r *boardRepo) Save(b *model.Board) error {
if b.ID != 0 {
// Already in database
return nil
}

return r.db.WithRollback(context.Background(), func(q *sqlc.Queries) error {
if b.Member.ID == 0 {
err := r.member.Save(&b.Member)
if err != nil {
return err
}
}

if b.AcademicYear.ID == 0 {
err := r.year.Save(&b.AcademicYear)
if err != nil {
return err
}
}

id, err := q.BoardCreate(context.Background(), sqlc.BoardCreateParams{
Member: int32(b.Member.ID),
AcademicYear: int32(b.AcademicYear.ID),
Role: b.Role,
})
if err != nil {
return fmt.Errorf("Unable to save board %+v | %v", *b, err)
}

b.ID = int(id)

return nil
})
}
22 changes: 11 additions & 11 deletions internal/pkg/db/repository/event.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,17 @@ import (
"time"

"github.com/ZeusWPI/events/internal/pkg/db/sqlc"
"github.com/ZeusWPI/events/internal/pkg/models"
"github.com/ZeusWPI/events/internal/pkg/model"
"github.com/ZeusWPI/events/pkg/db"
"github.com/ZeusWPI/events/pkg/util"
"github.com/jackc/pgx/v5/pgtype"
)

// Event provides all models.Event related database operations
// Event provides all model.Event related database operations
type Event interface {
GetAll() ([]*models.Event, error)
Save(*models.Event) error
Delete(*models.Event) error
GetAll() ([]*model.Event, error)
Save(*model.Event) error
Delete(*model.Event) error
}

type eventRepo struct {
Expand All @@ -29,7 +29,7 @@ type eventRepo struct {
var _ Event = (*eventRepo)(nil)

// GetAll returns all events
func (r *eventRepo) GetAll() ([]*models.Event, error) {
func (r *eventRepo) GetAll() ([]*model.Event, error) {
eventsDB, err := r.db.Queries().EventGetAll(context.Background())
if err != nil {
return nil, fmt.Errorf("Unable to get all events | %v", err)
Expand All @@ -40,14 +40,14 @@ func (r *eventRepo) GetAll() ([]*models.Event, error) {
return nil, err
}

events := make([]*models.Event, 0, len(eventsDB))
events := make([]*model.Event, 0, len(eventsDB))
for _, e := range eventsDB {
year, ok := util.SliceFind(years, func(y *models.AcademicYear) bool { return y.ID == int(e.AcademicYear) })
year, ok := util.SliceFind(years, func(y *model.AcademicYear) bool { return y.ID == int(e.AcademicYear) })
if !ok {
continue
}

event := &models.Event{
event := &model.Event{
ID: int(e.ID),
URL: e.Url,
Name: e.Name,
Expand All @@ -67,7 +67,7 @@ func (r *eventRepo) GetAll() ([]*models.Event, error) {
}

// Save creates a new academic year or updates an existing one
func (r *eventRepo) Save(e *models.Event) error {
func (r *eventRepo) Save(e *model.Event) error {
var id int32
var err error

Expand Down Expand Up @@ -107,7 +107,7 @@ func (r *eventRepo) Save(e *models.Event) error {
}

// Delete soft deletes an event
func (r *eventRepo) Delete(e *models.Event) error {
func (r *eventRepo) Delete(e *model.Event) error {
if e.ID == 0 {
return fmt.Errorf("Event has no ID %+v", *e)
}
Expand Down
Loading

0 comments on commit 08ac0ff

Please sign in to comment.