Skip to content

Commit e239cfc

Browse files
authored
Merge pull request #52 from acmcsufoss/interface
Create interfaces and implement more routes
2 parents 325e494 + d9ee024 commit e239cfc

21 files changed

+408
-80
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,5 @@ result/
3131

3232
# Build artifact generated by Makefile
3333
.generate.marker
34+
35+
tmp/

Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ generate: fmt $(GENERATE_MARKER)
2020
vet: fmt
2121
go vet ./...
2222

23-
run: generate
24-
go run ./cmd/api
23+
run: build
24+
./$(BIN_DIR)/$(APP_NAME)
2525

2626
build: generate
2727
mkdir -p $(BIN_DIR)

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ make # Compile program
2020
```
2121
OR
2222
```sh
23-
make run # This compiles & runs the program without creating a binary
23+
make run
2424
```
2525

2626
### Other useful commands from the Makefile

cmd/api/main.go

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package main
22

33
import (
44
"context"
5-
"database/sql"
65
"fmt"
76
"log"
87
"os"
@@ -11,6 +10,7 @@ import (
1110

1211
"github.com/acmcsufoss/api.acmcsuf.com/internal/api/routes"
1312
"github.com/acmcsufoss/api.acmcsuf.com/internal/api/services"
13+
"github.com/acmcsufoss/api.acmcsuf.com/internal/db"
1414
"github.com/acmcsufoss/api.acmcsuf.com/internal/db/models"
1515
"github.com/gin-gonic/gin"
1616
_ "modernc.org/sqlite"
@@ -28,28 +28,11 @@ func main() {
2828
cancel()
2929
}()
3030

31-
// Setup SQLite database & make sure we can connect to it
32-
uri := os.Getenv("DATABASE_URL")
33-
if uri == "" {
34-
log.Fatal("DATABASE_URL must be set")
35-
}
36-
db, err := sql.Open("sqlite", uri)
31+
db, err := db.New(ctx)
3732
if err != nil {
38-
log.Fatalf("Error opening SQLite database: %vl", err)
33+
log.Fatal(err)
3934
}
4035
defer db.Close()
41-
if err := db.PingContext(ctx); err != nil {
42-
log.Fatalf("Error connecting to database: %v", err)
43-
}
44-
45-
schemaBytes, err := os.ReadFile("internal/db/sql/schemas/schema.sql")
46-
if err != nil {
47-
log.Fatalf("Error reading schema file: %v", err)
48-
}
49-
50-
if _, err := db.ExecContext(ctx, string(schemaBytes)); err != nil {
51-
log.Fatalf("Error initializing db schema: %v", err)
52-
}
5336

5437
// Now we init services & gin router, and then start the server
5538
// Should this be moved to the routes module??

flake.lock

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

flake.nix

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
description = "Go Dev Environment for api.acmcsuf.com";
33

44
inputs = {
5-
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
5+
nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.11";
66
flake-utils.url = "github:numtide/flake-utils";
77
};
88

internal/api/handlers/announcement_handler.go

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ func (h *AnnouncementHandler) GetAnnouncement(c *gin.Context) {
2222
ctx := c.Request.Context()
2323
id := c.Param("id")
2424

25-
announcement, err := h.announcementService.GetAnnouncement(ctx, id)
25+
announcement, err := h.announcementService.Get(ctx, id)
2626

2727
if err != nil {
2828
if err.Error() == "sql: no rows in result set" {
@@ -50,15 +50,13 @@ func (h *AnnouncementHandler) CreateAnnouncement(c *gin.Context) {
5050
return
5151
}
5252

53-
announcement, err := h.announcementService.CreateAnnouncement(ctx, params)
54-
if err != nil {
53+
if err := h.announcementService.Create(ctx, params); err != nil {
5554
c.JSON(http.StatusInternalServerError, gin.H{
5655
"error": "Not implemented",
5756
})
5857
}
5958
c.JSON(http.StatusOK, gin.H{
60-
"message": "Event created successfully",
59+
"message": "Announcement created successfully",
6160
"uuid": params.Uuid,
6261
})
63-
c.JSON(http.StatusOK, announcement)
6462
}

internal/api/handlers/events_handler.go

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ func (h *EventsHandler) GetEvent(c *gin.Context) {
2424
ctx := c.Request.Context()
2525
id := c.Param("id")
2626

27-
event, err := h.eventsService.GetEvent(ctx, id)
27+
event, err := h.eventsService.Get(ctx, id)
2828

2929
if err != nil {
3030
if err.Error() == "sql: no rows in result set" {
@@ -61,7 +61,7 @@ func (h *EventsHandler) CreateEvent(c *gin.Context) {
6161
return
6262
}
6363

64-
err := h.eventsService.CreateEvent(ctx, params)
64+
err := h.eventsService.Create(ctx, params)
6565
if err != nil {
6666
c.JSON(http.StatusInternalServerError, gin.H{
6767
"error": "Failed to create event. " + err.Error(),
@@ -74,15 +74,31 @@ func (h *EventsHandler) CreateEvent(c *gin.Context) {
7474
})
7575
}
7676

77-
// TODO: implement the following handlers
7877
func (h *EventsHandler) GetEvents(c *gin.Context) {
79-
panic("implement me")
78+
ctx := c.Request.Context()
79+
host := c.Query("host")
80+
filters := []any{}
81+
82+
if host != "" {
83+
filters = append(filters, &services.HostFilter{Host: host})
84+
}
85+
86+
events, err := h.eventsService.List(ctx, filters...)
87+
if err != nil {
88+
c.JSON(http.StatusInternalServerError, gin.H{
89+
"error": "Failed to retrieve events",
90+
})
91+
return
92+
}
93+
c.JSON(http.StatusOK, events)
8094
}
8195

8296
func (h *EventsHandler) UpdateEvent(c *gin.Context) {
83-
panic("implement me")
97+
// ctx := c.Request.Context()
98+
// var params models.UpdateEventParams
99+
panic("implement me (EventsHandler UpdateEvent)")
84100
}
85101

86102
func (h *EventsHandler) DeleteEvent(c *gin.Context) {
87-
panic("implement me")
103+
panic("implement me (EventsHandler DeleteEvent)")
88104
}

internal/api/routes/routes.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88

99
func SetupRoutes(router *gin.Engine, eventService *services.EventsService, announcementService *services.AnnouncementService) {
1010
eventsHandler := handlers.NewEventHandler(eventService)
11-
// NOTE: Only GetEvent implemented so far
1211
router.GET("/events", eventsHandler.GetEvents)
1312
router.GET("/events/:id", eventsHandler.GetEvent)
1413
router.POST("/events", eventsHandler.CreateEvent)

internal/api/services/announcement_service.go

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,27 +6,59 @@ import (
66
"github.com/acmcsufoss/api.acmcsuf.com/internal/db/models"
77
)
88

9+
type AnnouncementServicer interface {
10+
Service[models.Announcement, string, models.CreateAnnouncementParams, models.UpdateAnnouncementParams]
11+
}
12+
913
type AnnouncementService struct {
1014
q *models.Queries
1115
}
1216

13-
var dll string
17+
// compile time check
18+
var _ AnnouncementServicer = (*AnnouncementService)(nil)
1419

1520
func NewAnnouncementService(q *models.Queries) *AnnouncementService {
1621
return &AnnouncementService{q: q}
1722
}
1823

19-
func (s *AnnouncementService) GetAnnouncement(ctx context.Context, uuid string) (models.Announcement, error) {
24+
func (s *AnnouncementService) Get(ctx context.Context, uuid string) (models.Announcement, error) {
2025
announcement, err := s.q.GetAnnouncement(ctx, uuid)
2126
if err != nil {
2227
return models.Announcement{}, err
2328
}
2429
return announcement, nil
2530
}
2631

27-
func (s *AnnouncementService) CreateAnnouncement(ctx context.Context, arg models.CreateAnnouncementParams) (models.Announcement, error) {
28-
if announcement, err := s.q.CreateAnnouncement(ctx, arg); err != nil {
29-
return announcement, err
32+
func (s *AnnouncementService) Create(ctx context.Context, params models.CreateAnnouncementParams) error {
33+
if err := s.q.CreateAnnouncement(ctx, params); err != nil {
34+
return err
35+
}
36+
return nil
37+
}
38+
39+
type AnnouncementFilter interface {
40+
Apply(events []models.Announcement) []models.Announcement
41+
}
42+
43+
func (s *AnnouncementService) List(ctx context.Context, filters ...any) ([]models.Announcement, error) {
44+
announcements, err := s.q.GetAnnouncements(ctx)
45+
if err != nil {
46+
return nil, err
47+
}
48+
49+
result := announcements
50+
for _, filter := range filters {
51+
if announcementFilter, ok := filter.(AnnouncementFilter); ok {
52+
result = announcementFilter.Apply(result)
53+
}
3054
}
31-
return models.Announcement{}, nil
55+
return result, nil
56+
}
57+
58+
func (s *AnnouncementService) Update(ctx context.Context, uuid string, params models.UpdateAnnouncementParams) error {
59+
panic("implement me (AnnouncementService Update)")
60+
}
61+
62+
func (s *AnnouncementService) Delete(ctx context.Context, uuid string) error {
63+
panic("implement me (AnnouncementService Delete)")
3264
}

0 commit comments

Comments
 (0)