Compare commits
8 Commits
3cc4cbe069
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
1774b432aa
|
|||
|
1ddbd1bc8b
|
|||
| 8b1468fc1f | |||
| c98fc938c9 | |||
| 025596162c | |||
| 399cfd827d | |||
| 1b528a85c8 | |||
| 20460925b0 |
19
.gitea/workflows/demo.yaml
Normal file
19
.gitea/workflows/demo.yaml
Normal file
@@ -0,0 +1,19 @@
|
||||
name: Gitea Actions Demo
|
||||
run-name: ${{ gitea.actor }} is testing out Gitea Actions 🚀
|
||||
on: [push]
|
||||
|
||||
jobs:
|
||||
Explore-Gitea-Actions:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- run: echo "🎉 The job was automatically triggered by a ${{ gitea.event_name }} event."
|
||||
- run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by Gitea!"
|
||||
- run: echo "🔎 The name of your branch is ${{ gitea.ref }} and your repository is ${{ gitea.repository }}."
|
||||
- name: Check out repository code
|
||||
uses: actions/checkout@v4
|
||||
- run: echo "💡 The ${{ gitea.repository }} repository has been cloned to the runner."
|
||||
- run: echo "🖥️ The workflow is now ready to test your code on the runner."
|
||||
- name: List files in the repository
|
||||
run: |
|
||||
ls ${{ gitea.workspace }}
|
||||
- run: echo "🍏 This job's status is ${{ job.status }}."
|
||||
@@ -11,6 +11,7 @@ FROM gcr.io/distroless/static-debian11 AS release-stage
|
||||
WORKDIR /
|
||||
COPY --from=build-stage /entrypoint /entrypoint
|
||||
COPY --from=build-stage /app/assets /assets
|
||||
COPY --from=build-stage /app/sql /sql
|
||||
EXPOSE 3000
|
||||
USER nonroot:nonroot
|
||||
ENTRYPOINT ["/entrypoint"]
|
||||
|
||||
5
main.go
5
main.go
@@ -12,6 +12,7 @@ import (
|
||||
"github.com/jackc/pgx/v5/pgxpool"
|
||||
"github.com/joho/godotenv"
|
||||
"michaelthomson.dev/mthomson/go-todos-app/handlers"
|
||||
"michaelthomson.dev/mthomson/go-todos-app/middleware"
|
||||
"michaelthomson.dev/mthomson/go-todos-app/repositories"
|
||||
"michaelthomson.dev/mthomson/go-todos-app/services"
|
||||
)
|
||||
@@ -129,8 +130,8 @@ func main() {
|
||||
router.HandleFunc("PATCH /todos/{id}/undone", todoHandler.Undone)
|
||||
|
||||
server := http.Server{
|
||||
Addr: "localhost:3000",
|
||||
Handler: router,
|
||||
Addr: ":3000",
|
||||
Handler: middleware.LoggingMiddleware(router),
|
||||
}
|
||||
|
||||
log.Fatal(server.ListenAndServe())
|
||||
|
||||
31
middleware/logging.go
Normal file
31
middleware/logging.go
Normal file
@@ -0,0 +1,31 @@
|
||||
package middleware
|
||||
|
||||
import (
|
||||
"log"
|
||||
"net/http"
|
||||
"time"
|
||||
)
|
||||
|
||||
type wrappedWriter struct {
|
||||
http.ResponseWriter
|
||||
statusCode int
|
||||
}
|
||||
|
||||
func (w * wrappedWriter) WriteHeader(statusCode int) {
|
||||
w.ResponseWriter.WriteHeader(statusCode)
|
||||
w.statusCode = statusCode
|
||||
}
|
||||
|
||||
func LoggingMiddleware(next http.Handler) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
start := time.Now()
|
||||
|
||||
wrapped := &wrappedWriter{
|
||||
ResponseWriter: w,
|
||||
statusCode: http.StatusOK,
|
||||
}
|
||||
|
||||
next.ServeHTTP(wrapped, r)
|
||||
log.Println(wrapped.statusCode, r.Method, r.URL.Path, time.Since(start))
|
||||
})
|
||||
}
|
||||
@@ -18,7 +18,7 @@ func (ts *PostgresTodoRepository) List() ([]models.Todo, error) {
|
||||
rows, err := ts.db.Query(context.Background(), "SELECT id, name, done FROM todo")
|
||||
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
log.Printf("Database error: %v", err)
|
||||
return todos, err
|
||||
}
|
||||
|
||||
@@ -26,7 +26,6 @@ func (ts *PostgresTodoRepository) List() ([]models.Todo, error) {
|
||||
var r models.Todo
|
||||
err := rows.Scan(&r.Id, &r.Name, &r.Done)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
return todos, err
|
||||
}
|
||||
todos = append(todos, r)
|
||||
@@ -40,7 +39,7 @@ func (ts *PostgresTodoRepository) Get(id uuid.UUID) (models.Todo, error) {
|
||||
err := ts.db.QueryRow(context.Background(), "SELECT id, name, done FROM todo WHERE id=$1", id).Scan(&todo.Id, &todo.Name, &todo.Done)
|
||||
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
log.Printf("Database error: %v", err)
|
||||
return todo, err
|
||||
}
|
||||
|
||||
@@ -51,7 +50,7 @@ func (ts *PostgresTodoRepository) Update(id uuid.UUID, name string, done bool) e
|
||||
_, err := ts.db.Exec(context.Background(), "UPDATE todo SET name=$1, done=$2 WHERE id=$3", name, done, id)
|
||||
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
log.Printf("Database error: %v", err)
|
||||
}
|
||||
|
||||
return err
|
||||
@@ -61,7 +60,7 @@ func (ts *PostgresTodoRepository) Add(todo models.Todo) error {
|
||||
_, err := ts.db.Exec(context.Background(), "INSERT INTO todo(id, name, done) values($1, $2, $3)", todo.Id, todo.Name, todo.Done)
|
||||
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
log.Printf("Database error: %v", err)
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -72,7 +71,7 @@ func (ts *PostgresTodoRepository) Delete(id uuid.UUID) error {
|
||||
_, err := ts.db.Exec(context.Background(), "DELETE FROM todo where id=$1", id)
|
||||
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
log.Printf("Database error: %v", err)
|
||||
return err
|
||||
}
|
||||
|
||||
|
||||
@@ -54,14 +54,14 @@ func (ts *TodoService) UpdateTodo(id uuid.UUID, name string, done bool) (models.
|
||||
return ts.db.Get(id)
|
||||
}
|
||||
|
||||
func (ts *TodoService) GetTodos() (todos []models.Todo, err error) {
|
||||
func (ts *TodoService) GetTodos() ([]models.Todo, error) {
|
||||
return ts.db.List()
|
||||
}
|
||||
|
||||
func (ts *TodoService) GetTodoById(id uuid.UUID) (todo models.Todo, err error) {
|
||||
func (ts *TodoService) GetTodoById(id uuid.UUID) (models.Todo, error) {
|
||||
return ts.db.Get(id)
|
||||
}
|
||||
|
||||
func (ts *TodoService) DeleteTodoById(id uuid.UUID) (err error) {
|
||||
func (ts *TodoService) DeleteTodoById(id uuid.UUID) error {
|
||||
return ts.db.Delete(id)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user