From 8a6e504f4482df3f2f5d372406397a30dd16f890 Mon Sep 17 00:00:00 2001 From: Jake Hobbs Date: Fri, 21 Jun 2024 13:30:45 -0700 Subject: [PATCH 1/2] add tally endpoint --- service/db.go | 3 ++- service/handlers.go | 33 +++++++++++++++++++++++++++++++-- service/main.go | 11 +++++++---- service/model/tally.go | 18 ++++++++++++++++++ src/components/petition.tsx | 2 +- src/routeTree.gen.ts | 14 -------------- 6 files changed, 59 insertions(+), 22 deletions(-) create mode 100644 service/model/tally.go diff --git a/service/db.go b/service/db.go index bf37bff..815c306 100644 --- a/service/db.go +++ b/service/db.go @@ -1,9 +1,10 @@ package main import ( + "log" + "github.com/dxe/helptheducks.com/service/config" "github.com/jmoiron/sqlx" - "log" ) // TODO: make a separate script to init db b/c this is kinda sketch for prod. diff --git a/service/handlers.go b/service/handlers.go index 133e60b..2fc3e43 100644 --- a/service/handlers.go +++ b/service/handlers.go @@ -4,10 +4,12 @@ import ( "database/sql" "encoding/json" "fmt" - "github.com/dxe/helptheducks.com/service/config" - "github.com/dxe/helptheducks.com/service/model" "net/http" "net/mail" + + "github.com/dxe/helptheducks.com/service/config" + "github.com/dxe/helptheducks.com/service/model" + "github.com/go-chi/chi/v5" ) type CreateMessageInput struct { @@ -92,3 +94,30 @@ func createMessageHandler(w http.ResponseWriter, r *http.Request) { w.Write([]byte("ok")) } + +type GetTallyResp struct { + Total int `json:"total"` +} + +func getTallyHandler(w http.ResponseWriter, r *http.Request) { + campaign := chi.URLParam(r, "campaign") + + tally, err := model.GetTally(db, campaign) + if err != nil { + http.Error(w, fmt.Sprintf("error getting tally: %v", err), http.StatusInternalServerError) + return + } + + resp := GetTallyResp{ + Total: tally, + } + json, err := json.Marshal(resp) + if err != nil { + http.Error(w, "failed to marshal json", http.StatusInternalServerError) + return + } + + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + w.Write(json) +} diff --git a/service/main.go b/service/main.go index 62bb9a6..a954108 100644 --- a/service/main.go +++ b/service/main.go @@ -2,6 +2,11 @@ package main import ( "fmt" + "net/http" + "strings" + "time" + "unicode" + "github.com/aws/aws-sdk-go/service/ses" "github.com/dxe/helptheducks.com/service/config" "github.com/dxe/helptheducks.com/service/mailer" @@ -11,10 +16,6 @@ import ( "github.com/go-chi/cors" _ "github.com/go-sql-driver/mysql" "github.com/jmoiron/sqlx" - "net/http" - "strings" - "time" - "unicode" "golang.org/x/text/runes" "golang.org/x/text/transform" @@ -53,6 +54,8 @@ func main() { r.Post("/create", createMessageHandler) }) + r.Get("/tally", getTallyHandler) + go worker() fmt.Printf("Listening on port %v\n", config.Port) diff --git a/service/model/tally.go b/service/model/tally.go new file mode 100644 index 0000000..68e9a3a --- /dev/null +++ b/service/model/tally.go @@ -0,0 +1,18 @@ +package model + +import "github.com/jmoiron/sqlx" + +func GetTally(db *sqlx.DB, campaign string) (int, error) { + var tally int + err := db.Get( + &tally, + `SELECT count(*) as total + FROM messages + WHERE campaign = ?`, + campaign, + ) + if (err != nil) { + return 0, err + } + return tally, nil +} \ No newline at end of file diff --git a/src/components/petition.tsx b/src/components/petition.tsx index 7857082..5afd9de 100644 --- a/src/components/petition.tsx +++ b/src/components/petition.tsx @@ -121,7 +121,7 @@ export const Petition = () => { ...(data.zip && { zip: data.zip }), ...(data.city && { city: data.city }), message: data.message, - campaign: "duck", + campaign: import.meta.env.PROD ? "duck" : "test", token, }, headers: { diff --git a/src/routeTree.gen.ts b/src/routeTree.gen.ts index 7326bbb..470e2eb 100644 --- a/src/routeTree.gen.ts +++ b/src/routeTree.gen.ts @@ -1,17 +1,9 @@ -// This file is auto-generated by TanStack Router - import { FileRoute, lazyRouteComponent } from '@tanstack/react-router' -// Import Routes - import { Route as rootRoute } from './routes/__root' -// Create Virtual Routes - const IndexComponentImport = new FileRoute('/').createRoute() -// Create/Update Routes - const IndexComponentRoute = IndexComponentImport.update({ path: '/', getParentRoute: () => rootRoute, @@ -21,9 +13,6 @@ const IndexComponentRoute = IndexComponentImport.update({ 'component', ), }) - -// Populate the FileRoutesByPath interface - declare module '@tanstack/react-router' { interface FileRoutesByPath { '/': { @@ -32,7 +21,4 @@ declare module '@tanstack/react-router' { } } } - -// Create and export the route tree - export const routeTree = rootRoute.addChildren([IndexComponentRoute]) From b82bd3f4be02312fa7f90a55456ecaf70e2eb10e Mon Sep 17 00:00:00 2001 From: Jake Hobbs Date: Fri, 21 Jun 2024 13:32:13 -0700 Subject: [PATCH 2/2] remove unneeded alias --- service/model/tally.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/service/model/tally.go b/service/model/tally.go index 68e9a3a..ff87cc5 100644 --- a/service/model/tally.go +++ b/service/model/tally.go @@ -6,7 +6,7 @@ func GetTally(db *sqlx.DB, campaign string) (int, error) { var tally int err := db.Get( &tally, - `SELECT count(*) as total + `SELECT count(*) FROM messages WHERE campaign = ?`, campaign,