diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000..3556420e43 Binary files /dev/null and b/.DS_Store differ diff --git a/.env b/.env new file mode 100644 index 0000000000..14f6494f9b --- /dev/null +++ b/.env @@ -0,0 +1 @@ +PORT="8080" diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml new file mode 100644 index 0000000000..6dc1e93aef --- /dev/null +++ b/.github/workflows/cd.yml @@ -0,0 +1,34 @@ +name: cd + +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.25.1" + + - name: Build production app + run: ./scripts/buildprod.sh + + - name: Authenticate to Google Cloud + uses: google-github-actions/auth@v2 + with: + credentials_json: ${{ secrets.GCP_CREDENTIALS }} + + - name: Set up Cloud SDK + uses: google-github-actions/setup-gcloud@v2 + + - name: Build and push Docker image + run: | + gcloud builds submit --tag us-central1-docker.pkg.dev/${{ secrets.GCP_PROJECT_ID }}/notely-repo/notely:latest . \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000000..2883422b54 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,22 @@ +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.25.1" + + - name: Run tests + run: go test -cover ./... \ No newline at end of file diff --git a/README.md b/README.md index c2bec0368b..6397ad1605 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +![CI Tests](https://github.com/Jay-Jay-Capacity/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). @@ -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! + +Fortune's version of Boot.dev's Notely app. diff --git a/coverage.out b/coverage.out new file mode 100644 index 0000000000..91b33da5a9 --- /dev/null +++ b/coverage.out @@ -0,0 +1,100 @@ +mode: set +github.com/bootdotdev/learn-cicd-starter/handler_notes.go:12.99,14.16 2 0 +github.com/bootdotdev/learn-cicd-starter/handler_notes.go:14.16,17.3 2 0 +github.com/bootdotdev/learn-cicd-starter/handler_notes.go:19.2,20.16 2 0 +github.com/bootdotdev/learn-cicd-starter/handler_notes.go:20.16,23.3 2 0 +github.com/bootdotdev/learn-cicd-starter/handler_notes.go:25.2,25.46 1 0 +github.com/bootdotdev/learn-cicd-starter/handler_notes.go:28.102,35.16 5 0 +github.com/bootdotdev/learn-cicd-starter/handler_notes.go:35.16,38.3 2 0 +github.com/bootdotdev/learn-cicd-starter/handler_notes.go:40.2,48.16 3 0 +github.com/bootdotdev/learn-cicd-starter/handler_notes.go:48.16,51.3 2 0 +github.com/bootdotdev/learn-cicd-starter/handler_notes.go:53.2,54.16 2 0 +github.com/bootdotdev/learn-cicd-starter/handler_notes.go:54.16,57.3 2 0 +github.com/bootdotdev/learn-cicd-starter/handler_notes.go:59.2,60.16 2 0 +github.com/bootdotdev/learn-cicd-starter/handler_notes.go:60.16,63.3 2 0 +github.com/bootdotdev/learn-cicd-starter/handler_notes.go:65.2,65.50 1 0 +github.com/bootdotdev/learn-cicd-starter/handler_ready.go:5.63,7.2 1 0 +github.com/bootdotdev/learn-cicd-starter/handler_user.go:15.82,22.16 5 0 +github.com/bootdotdev/learn-cicd-starter/handler_user.go:22.16,25.3 2 0 +github.com/bootdotdev/learn-cicd-starter/handler_user.go:27.2,28.16 2 0 +github.com/bootdotdev/learn-cicd-starter/handler_user.go:28.16,31.3 2 0 +github.com/bootdotdev/learn-cicd-starter/handler_user.go:33.2,40.16 2 0 +github.com/bootdotdev/learn-cicd-starter/handler_user.go:40.16,43.3 2 0 +github.com/bootdotdev/learn-cicd-starter/handler_user.go:45.2,46.16 2 0 +github.com/bootdotdev/learn-cicd-starter/handler_user.go:46.16,49.3 2 0 +github.com/bootdotdev/learn-cicd-starter/handler_user.go:51.2,52.16 2 0 +github.com/bootdotdev/learn-cicd-starter/handler_user.go:52.16,55.3 2 0 +github.com/bootdotdev/learn-cicd-starter/handler_user.go:56.2,56.50 1 0 +github.com/bootdotdev/learn-cicd-starter/handler_user.go:59.49,62.16 3 0 +github.com/bootdotdev/learn-cicd-starter/handler_user.go:62.16,64.3 1 0 +github.com/bootdotdev/learn-cicd-starter/handler_user.go:65.2,67.24 3 0 +github.com/bootdotdev/learn-cicd-starter/handler_user.go:70.99,73.16 2 0 +github.com/bootdotdev/learn-cicd-starter/handler_user.go:73.16,76.3 2 0 +github.com/bootdotdev/learn-cicd-starter/handler_user.go:78.2,78.45 1 0 +github.com/bootdotdev/learn-cicd-starter/json.go:9.82,10.19 1 0 +github.com/bootdotdev/learn-cicd-starter/json.go:10.19,12.3 1 0 +github.com/bootdotdev/learn-cicd-starter/json.go:13.2,13.16 1 0 +github.com/bootdotdev/learn-cicd-starter/json.go:13.16,15.3 1 0 +github.com/bootdotdev/learn-cicd-starter/json.go:16.2,21.4 2 0 +github.com/bootdotdev/learn-cicd-starter/json.go:24.76,27.16 3 0 +github.com/bootdotdev/learn-cicd-starter/json.go:27.16,31.3 3 0 +github.com/bootdotdev/learn-cicd-starter/json.go:32.2,33.14 2 0 +github.com/bootdotdev/learn-cicd-starter/main.go:27.13,29.16 2 0 +github.com/bootdotdev/learn-cicd-starter/main.go:29.16,31.3 1 0 +github.com/bootdotdev/learn-cicd-starter/main.go:33.2,34.16 2 0 +github.com/bootdotdev/learn-cicd-starter/main.go:34.16,36.3 1 0 +github.com/bootdotdev/learn-cicd-starter/main.go:38.2,43.17 3 0 +github.com/bootdotdev/learn-cicd-starter/main.go:43.17,46.3 2 0 +github.com/bootdotdev/learn-cicd-starter/main.go:46.8,48.17 2 0 +github.com/bootdotdev/learn-cicd-starter/main.go:48.17,50.4 1 0 +github.com/bootdotdev/learn-cicd-starter/main.go:51.3,53.40 3 0 +github.com/bootdotdev/learn-cicd-starter/main.go:56.2,67.63 3 0 +github.com/bootdotdev/learn-cicd-starter/main.go:67.63,69.17 2 0 +github.com/bootdotdev/learn-cicd-starter/main.go:69.17,72.4 2 0 +github.com/bootdotdev/learn-cicd-starter/main.go:73.3,74.42 2 0 +github.com/bootdotdev/learn-cicd-starter/main.go:74.42,76.4 1 0 +github.com/bootdotdev/learn-cicd-starter/main.go:79.2,81.22 2 0 +github.com/bootdotdev/learn-cicd-starter/main.go:81.22,86.3 4 0 +github.com/bootdotdev/learn-cicd-starter/main.go:88.2,97.33 5 0 +github.com/bootdotdev/learn-cicd-starter/middleware_auth.go:12.78,13.54 1 0 +github.com/bootdotdev/learn-cicd-starter/middleware_auth.go:13.54,15.17 2 0 +github.com/bootdotdev/learn-cicd-starter/middleware_auth.go:15.17,18.4 2 0 +github.com/bootdotdev/learn-cicd-starter/middleware_auth.go:20.3,21.17 2 0 +github.com/bootdotdev/learn-cicd-starter/middleware_auth.go:21.17,24.4 2 0 +github.com/bootdotdev/learn-cicd-starter/middleware_auth.go:26.3,26.22 1 0 +github.com/bootdotdev/learn-cicd-starter/models.go:17.59,19.16 2 0 +github.com/bootdotdev/learn-cicd-starter/models.go:19.16,21.3 1 0 +github.com/bootdotdev/learn-cicd-starter/models.go:23.2,24.16 2 0 +github.com/bootdotdev/learn-cicd-starter/models.go:24.16,26.3 1 0 +github.com/bootdotdev/learn-cicd-starter/models.go:27.2,33.8 1 0 +github.com/bootdotdev/learn-cicd-starter/models.go:44.59,46.16 2 0 +github.com/bootdotdev/learn-cicd-starter/models.go:46.16,48.3 1 0 +github.com/bootdotdev/learn-cicd-starter/models.go:50.2,51.16 2 0 +github.com/bootdotdev/learn-cicd-starter/models.go:51.16,53.3 1 0 +github.com/bootdotdev/learn-cicd-starter/models.go:54.2,60.8 1 0 +github.com/bootdotdev/learn-cicd-starter/models.go:63.66,65.29 2 0 +github.com/bootdotdev/learn-cicd-starter/models.go:65.29,68.17 3 0 +github.com/bootdotdev/learn-cicd-starter/models.go:68.17,70.4 1 0 +github.com/bootdotdev/learn-cicd-starter/models.go:73.2,73.20 1 0 +github.com/bootdotdev/learn-cicd-starter/internal/database/db.go:19.28,21.2 1 0 +github.com/bootdotdev/learn-cicd-starter/internal/database/db.go:27.47,31.2 1 0 +github.com/bootdotdev/learn-cicd-starter/internal/database/notes.sql.go:25.79,34.2 2 0 +github.com/bootdotdev/learn-cicd-starter/internal/database/notes.sql.go:41.73,52.2 4 0 +github.com/bootdotdev/learn-cicd-starter/internal/database/notes.sql.go:59.87,61.16 2 0 +github.com/bootdotdev/learn-cicd-starter/internal/database/notes.sql.go:61.16,63.3 1 0 +github.com/bootdotdev/learn-cicd-starter/internal/database/notes.sql.go:64.2,66.18 3 0 +github.com/bootdotdev/learn-cicd-starter/internal/database/notes.sql.go:66.18,74.17 2 0 +github.com/bootdotdev/learn-cicd-starter/internal/database/notes.sql.go:74.17,76.4 1 0 +github.com/bootdotdev/learn-cicd-starter/internal/database/notes.sql.go:77.3,77.27 1 0 +github.com/bootdotdev/learn-cicd-starter/internal/database/notes.sql.go:79.2,79.37 1 0 +github.com/bootdotdev/learn-cicd-starter/internal/database/notes.sql.go:79.37,81.3 1 0 +github.com/bootdotdev/learn-cicd-starter/internal/database/notes.sql.go:82.2,82.35 1 0 +github.com/bootdotdev/learn-cicd-starter/internal/database/notes.sql.go:82.35,84.3 1 0 +github.com/bootdotdev/learn-cicd-starter/internal/database/notes.sql.go:85.2,85.19 1 0 +github.com/bootdotdev/learn-cicd-starter/internal/database/users.sql.go:31.79,40.2 2 0 +github.com/bootdotdev/learn-cicd-starter/internal/database/users.sql.go:47.77,58.2 4 0 +github.com/bootdotdev/learn-cicd-starter/internal/auth/auth.go:12.53,14.22 2 1 +github.com/bootdotdev/learn-cicd-starter/internal/auth/auth.go:14.22,16.3 1 1 +github.com/bootdotdev/learn-cicd-starter/internal/auth/auth.go:17.2,18.52 2 1 +github.com/bootdotdev/learn-cicd-starter/internal/auth/auth.go:18.52,20.3 1 1 +github.com/bootdotdev/learn-cicd-starter/internal/auth/auth.go:22.2,22.26 1 1 diff --git a/internal/.DS_Store b/internal/.DS_Store new file mode 100644 index 0000000000..1d3f4949b3 Binary files /dev/null and b/internal/.DS_Store differ diff --git a/internal/auth/auth_test.go b/internal/auth/auth_test.go new file mode 100644 index 0000000000..76f126fee3 --- /dev/null +++ b/internal/auth/auth_test.go @@ -0,0 +1,47 @@ +package auth + +import ( + "net/http" + "testing" +) + +// TestGetAPIKey tests the GetAPIKey function. +func TestGetAPIKey(t *testing.T) { + // Sub-test for a valid, well-formed Authorization header. + t.Run("Valid API Key", func(t *testing.T) { + headers := http.Header{} + headers.Set("Authorization", "ApiKey my-secret-key") + + key, err := GetAPIKey(headers) + if err != nil { + t.Fatalf("expected no error, got %v", err) + } + if key != "my-secret-key" { + t.Errorf("expected key to be 'my-secret-key', got '%s'", key) + } + }) + + // Sub-test for a missing Authorization header. + t.Run("No Auth Header", func(t *testing.T) { + headers := http.Header{} + + _, err := GetAPIKey(headers) + if err == nil { + t.Fatal("expected an error, but got none") + } + if err != ErrNoAuthHeaderIncluded { + t.Errorf("expected error '%v', got '%v'", ErrNoAuthHeaderIncluded, err) + } + }) + + // Sub-test for a malformed Authorization header. + t.Run("Malformed Auth Header", func(t *testing.T) { + headers := http.Header{} + headers.Set("Authorization", "Bearer some-other-token") + + _, err := GetAPIKey(headers) + if err == nil { + t.Fatal("expected an error, but got none") + } + }) +} diff --git a/sql/.DS_Store b/sql/.DS_Store new file mode 100644 index 0000000000..4832d0154d Binary files /dev/null and b/sql/.DS_Store differ diff --git a/vendor/.DS_Store b/vendor/.DS_Store new file mode 100644 index 0000000000..87d982c16e Binary files /dev/null and b/vendor/.DS_Store differ