Skip to content
This repository has been archived by the owner on Jan 25, 2025. It is now read-only.

Commit

Permalink
Added visitor student lookup endpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
tahirmurata committed Oct 15, 2024
1 parent 1c19eb6 commit 3ee40b1
Show file tree
Hide file tree
Showing 5 changed files with 103 additions and 0 deletions.
31 changes: 31 additions & 0 deletions internal/database/database.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ type Service interface {

GetVisitor(ip netip.Addr, sqid *sqids.Sqids) (string, error)

GetVisitorStudent(visitorID int64, visitorRandom int32) (sqlc.Student, error)

CreateVisitor(ip netip.Addr, rand int32, sqid *sqids.Sqids) (string, error)

// IpNode(ip netip.Addr) (sqlc.Node, error)
Expand Down Expand Up @@ -221,6 +223,35 @@ func (s *DbService) GetVisitor(ip netip.Addr, sqid *sqids.Sqids) (string, error)
return visitorF3SiD, nil
}

func (s *DbService) GetVisitorStudent(visitorID int64, visitorRandom int32) (sqlc.Student, error) {
ctx := context.Background()

q, err := s.DB.Begin(ctx)
defer q.Rollback(ctx)
if err != nil {
return sqlc.Student{}, err
}
queries := sqlc.New(q)

visitorById, err := queries.GetVisitorByIdAndRandom(ctx, sqlc.GetVisitorByIdAndRandomParams{
ID: visitorID,
Random: visitorRandom,
})
if err != nil {
return sqlc.Student{}, err
}

studentByID, err := queries.GetStudentByVisitorIdAndRandom(ctx, sqlc.GetStudentByVisitorIdAndRandomParams{
ID: visitorById.ID,
Random: visitorById.Random,
})
if err != nil {
return sqlc.Student{}, err
}

return studentByID, nil
}

func (s *DbService) CreateVisitor(ip netip.Addr, rand int32, sqid *sqids.Sqids) (string, error) {
ctx := context.Background()

Expand Down
35 changes: 35 additions & 0 deletions internal/server/routes.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,8 @@ func (s *Server) ApiRoutes() *echo.Echo {

api.GET("/visitor", s.VisitorHandler) // middleware.RateLimiter(limiterStore)

api.GET("/visitor/:f3sid", s.VisitorLookupHandler)

api.POST("/node", s.NodeOTPHandler)

// api.POST("/vote", s.VoteHandler) // middleware.RateLimiter(limiterStore)
Expand Down Expand Up @@ -267,6 +269,39 @@ func (s *Server) VisitorHandler(c echo.Context) error {
})
}

func (s *Server) VisitorLookupHandler(c echo.Context) error {
var visitorLookup visitorLookup

err := c.Bind(&visitorLookup)
if err != nil {
slog.Error("bind", "error", err)
return echo.ErrBadRequest
}

sqid, err := Sqids()
if err != nil {
slog.Error("sqids initialization", "error", err)
return echo.ErrInternalServerError
}

visitorLookupVisitorID := sqid.Decode(visitorLookup.visitorF3SiD)
if len(visitorLookupVisitorID) != 2 {
slog.Error("sqids decode", "error", "invalid sqids")
return echo.ErrBadRequest
}

studentByVisitor, err := s.DB.GetVisitorStudent(int64(visitorLookupVisitorID[0]), int32(visitorLookupVisitorID[1]))
if err != nil {
slog.Error("student by visitor", "error", err)
return echo.ErrBadRequest
}

return c.JSON(http.StatusOK, map[string]int{
"grade": int(studentByVisitor.Grade),
"class": int(studentByVisitor.Class),
})
}

type vote struct {
ModelID int `json:"model_id"`
VisitorF3SiD string `json:"f3sid"`
Expand Down
28 changes: 28 additions & 0 deletions internal/sqlc/query.sql.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 7 additions & 0 deletions sql/query.sql
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,13 @@ LIMIT 1;
INSERT INTO visitors (ip, random)
VALUES ($1, $2)
RETURNING *;
-- name: GetStudentByVisitorIdAndRandom :one
SELECT s.*
FROM students s
JOIN visitors v ON s.visitor_id = v.id
WHERE v.id = $1
AND v.random = $2
LIMIT 1;
-- name: UpdateVisitorModel :exec
UPDATE visitors
SET model_id = $1,
Expand Down
2 changes: 2 additions & 0 deletions sql/schema.sql
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,8 @@ CREATE TABLE exhibition_logs (
CREATE INDEX idx_visitors_ip ON visitors (ip);
CREATE INDEX idx_visitors_id ON visitors (id);
CREATE INDEX idx_visitors_id_random ON visitors (id, random);
-- Students Table
CREATE INDEX idx_students_visitor_id ON students (visitor_id);
-- Nodes Table
CREATE INDEX idx_nodes_ip ON nodes (ip);
CREATE INDEX idx_nodes_key ON nodes (key);
Expand Down

0 comments on commit 3ee40b1

Please sign in to comment.