Skip to content
20 changes: 20 additions & 0 deletions .github/workflows/cd.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
on:
push:
branches: [main]

jobs:
deploy:
name: Deploy
runs-on: ubuntu-latest

steps:
- name: Check out code
uses: actions/checkout@v4

- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: "1.26.0"

- name: Build app
run: ./scripts/buildprod.sh
50 changes: 50 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
name: ci

on:
pull_request:
branches: [main]

jobs:
tests:
name: Tests
runs-on: ubuntu-latest

steps:
- name: Check out code
uses: actions/checkout@v4

- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: "1.26.0"

- name: Run tests
run: go test -cover ./...

- name: Install gosec
run: go install github.com/securego/gosec/v2/cmd/gosec@latest

- name: Gosec check
run: gosec ./...

style:
name: Style
runs-on: ubuntu-latest

steps:
- name: Check out code
uses: actions/checkout@v4

- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: "1.26.0"

- name: Format check
run: test -z $(go fmt ./...)

- name: Install staticcshock
run: go install honnef.co/go/tools/cmd/staticcheck@latest

- name: Run staticcshock
run: staticcheck ./...
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
![Tests](https://github.com/BetoDev25/learn-cicd-starter/actions/workflows/ci.yml/badge.svg)

# learn-cicd-starter (Notely)

This repo contains the starter code for the "Notely" application for the "Learn CICD" course on [Boot.dev](https://boot.dev).
Expand All @@ -21,3 +23,5 @@ go build -o notely && ./notely
*This starts the server in non-database mode.* It will serve a simple webpage at `http://localhost:8080`.

You do *not* need to set up a database or any interactivity on the webpage yet. Instructions for that will come later in the course!

Beto's version of Boot.dev's Notely app.
52 changes: 52 additions & 0 deletions internal/auth/get_api_key_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package auth

import (
"errors"
"net/http"
"testing"
)

func TestGetAPIKey(t *testing.T) {
type test struct {
name string
input http.Header
want string
wantErr error
}

tests := []test{
{
name: "valid header", input: http.Header{
"Authorization": []string{"ApiKey 1234567890abcdef"},
},
want: "1234567890abcdef",
wantErr: nil,
},
{
name: "invalid header", input: http.Header{
"Authorization": []string{"ApiKey"},
},
want: "",
wantErr: errors.New("malformed authorization header"),
},
{
name: "no header", input: http.Header{},
want: "",
wantErr: ErrNoAuthHeaderIncluded,
},
}

for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
key, err := GetAPIKey(tc.input)
if key != tc.want {
t.Errorf("expected: %s, got: %s", tc.want, key)
}
if (err == nil) != (tc.wantErr == nil) {
t.Errorf("expected: %v, got: %v", tc.wantErr, err)
} else if err != nil && tc.wantErr != nil && err.Error() != tc.wantErr.Error() {
t.Errorf("expected error message: %v, got: %v", tc.wantErr.Error(), err.Error())
}
})
}
}
7 changes: 6 additions & 1 deletion json.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,5 +30,10 @@ func respondWithJSON(w http.ResponseWriter, code int, payload interface{}) {
return
}
w.WriteHeader(code)
w.Write(dat)
_, err = w.Write(dat)
if err != nil {
log.Printf("Error writing to header: %s", err)
w.WriteHeader(500)
return
}
}
14 changes: 10 additions & 4 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import (
"log"
"net/http"
"os"
"strconv"
"time"

"github.com/go-chi/chi"
"github.com/go-chi/cors"
Expand Down Expand Up @@ -89,10 +91,14 @@ func main() {

router.Mount("/v1", v1Router)
srv := &http.Server{
Addr: ":" + port,
Handler: router,
Addr: ":" + port,
Handler: router,
ReadHeaderTimeout: time.Second * 10,
}

log.Printf("Serving on port: %s\n", port)
n, err := strconv.Atoi(port)
if err != nil {
log.Fatal(err)
}
log.Printf("Serving on port: %d\n", n)
log.Fatal(srv.ListenAndServe())
}