Compare commits

..

10 Commits

Author SHA1 Message Date
clz
046f2a9164 fix: rename 2023-06-03 20:54:53 +08:00
clz
63bf768535 feat: test cases 2023-06-03 20:00:11 +08:00
clz
c82a369d65 fix: add return content 2023-06-03 19:59:51 +08:00
clz
e7b0bb04b3 refactor: api url 2023-06-03 19:38:39 +08:00
clz
4e1f724970 refactor: rename docker image name 2023-06-02 19:03:08 +08:00
clz
1bf3aefbc5 fix: api url 2023-06-02 16:08:12 +08:00
clz
1efac96704 feat: label curd 2023-06-02 16:07:54 +08:00
3473adabbc feat: add shutdown url 2023-06-01 20:25:54 +08:00
d37f178ddd refactor: add prod mod 2023-06-01 20:25:38 +08:00
49a21a0449 feat: add migrate sql data 2023-06-01 20:07:02 +08:00
16 changed files with 346 additions and 129 deletions

View File

@ -17,8 +17,8 @@ RUN go mod download
COPY . . COPY . .
# Build our application. # Build our application.
#RUN CGO_ENABLED=0 GOOS=linux go build -o docker-mariadb-clean-arch ./cmd/docker-mariadb-clean-arch/main.go RUN #CGO_ENABLED=0 GOOS=linux go build -o bill-server ./cmd/bill-server/main.go
RUN go build -a -ldflags "-linkmode external -extldflags '-static' -s -w" -o docker-mariadb-clean-arch ./cmd/docker-mariadb-clean-arch/main.go RUN go build -a -ldflags "-linkmode external -extldflags '-static' -s -w" -o bill-server ./cmd/bill-server/main.go
@ -29,8 +29,8 @@ FROM scratch AS prod
WORKDIR /production WORKDIR /production
# Copy our compiled executable from the last stage. # Copy our compiled executable from the last stage.
COPY --from=api /compiler/docker-mariadb-clean-arch . COPY --from=api /compiler/bill-server .
# Run application and expose port 8080. # Run application and expose port 8080.
EXPOSE 8080 EXPOSE 8080
CMD ["./docker-mariadb-clean-arch"] CMD ["./bill-server"]

View File

@ -1,15 +1,16 @@
version: "3.9" version: "3.9"
services: services:
fiber-application: fiber-application:
restart: always restart: on-failure
image: docker-mariadb-clean-arch:latest image: bill-server:latest
build: build:
context: . context: .
dockerfile: Dockerfile dockerfile: Dockerfile
target: prod target: prod
ports: ports:
- 8080:8080 - "8080:8080"
environment: environment:
- ENV=prod
- API_USERID=1 - API_USERID=1
- API_USERNAME=fiber - API_USERNAME=fiber
- API_PASSWORD=fiber - API_PASSWORD=fiber
@ -18,7 +19,7 @@ services:
- application - application
# depends_on: # depends_on:
# - mariadb # - mariadb
command: ./docker-mariadb-clean-arch command: ./bill-server
# mariadb: # mariadb:
# image: mariadb:10.6.3 # image: mariadb:10.6.3

2
go.mod
View File

@ -22,12 +22,14 @@ require (
github.com/mattn/go-sqlite3 v1.14.16 // indirect github.com/mattn/go-sqlite3 v1.14.16 // indirect
github.com/philhofer/fwd v1.1.2 // indirect github.com/philhofer/fwd v1.1.2 // indirect
github.com/rivo/uniseg v0.2.0 // indirect github.com/rivo/uniseg v0.2.0 // indirect
github.com/samber/lo v1.38.1 // indirect
github.com/savsgio/dictpool v0.0.0-20221023140959-7bf2e61cea94 // indirect github.com/savsgio/dictpool v0.0.0-20221023140959-7bf2e61cea94 // indirect
github.com/savsgio/gotils v0.0.0-20230208104028-c358bd845dee // indirect github.com/savsgio/gotils v0.0.0-20230208104028-c358bd845dee // indirect
github.com/tinylib/msgp v1.1.8 // indirect github.com/tinylib/msgp v1.1.8 // indirect
github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect
github.com/valyala/fasthttp v1.45.0 // indirect github.com/valyala/fasthttp v1.45.0 // indirect
github.com/valyala/tcplisten v1.0.0 // indirect github.com/valyala/tcplisten v1.0.0 // indirect
golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17 // indirect
golang.org/x/sys v0.7.0 // indirect golang.org/x/sys v0.7.0 // indirect
gorm.io/driver/sqlite v1.5.1 // indirect gorm.io/driver/sqlite v1.5.1 // indirect
gorm.io/gorm v1.25.1 // indirect gorm.io/gorm v1.25.1 // indirect

4
go.sum
View File

@ -37,6 +37,8 @@ github.com/philhofer/fwd v1.1.2 h1:bnDivRJ1EWPjUIRXV5KfORO897HTbpFAQddBdE8t7Gw=
github.com/philhofer/fwd v1.1.2/go.mod h1:qkPdfjR2SIEbspLqpe1tO4n5yICnr2DY7mqEx2tUTP0= github.com/philhofer/fwd v1.1.2/go.mod h1:qkPdfjR2SIEbspLqpe1tO4n5yICnr2DY7mqEx2tUTP0=
github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/samber/lo v1.38.1 h1:j2XEAqXKb09Am4ebOg31SpvzUTTs6EN3VfgeLUhPdXM=
github.com/samber/lo v1.38.1/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA=
github.com/savsgio/dictpool v0.0.0-20221023140959-7bf2e61cea94 h1:rmMl4fXJhKMNWl+K+r/fq4FbbKI+Ia2m9hYBLm2h4G4= github.com/savsgio/dictpool v0.0.0-20221023140959-7bf2e61cea94 h1:rmMl4fXJhKMNWl+K+r/fq4FbbKI+Ia2m9hYBLm2h4G4=
github.com/savsgio/dictpool v0.0.0-20221023140959-7bf2e61cea94/go.mod h1:90zrgN3D/WJsDd1iXHT96alCoN2KJo6/4x1DZC3wZs8= github.com/savsgio/dictpool v0.0.0-20221023140959-7bf2e61cea94/go.mod h1:90zrgN3D/WJsDd1iXHT96alCoN2KJo6/4x1DZC3wZs8=
github.com/savsgio/gotils v0.0.0-20220530130905-52f3993e8d6d/go.mod h1:Gy+0tqhJvgGlqnTF8CVGP0AaGRjwBtXs/a5PA0Y3+A4= github.com/savsgio/gotils v0.0.0-20220530130905-52f3993e8d6d/go.mod h1:Gy+0tqhJvgGlqnTF8CVGP0AaGRjwBtXs/a5PA0Y3+A4=
@ -61,6 +63,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh
golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A= golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A=
golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17 h1:3MTrJm4PyNL9NBqvYDSj3DHl46qQakyfqfWo4jgfaEM=
golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.7.0 h1:LapD9S96VoQRhi/GrNTqeBJFrUjs5UHCAtTlgwA5oZA= golang.org/x/mod v0.7.0 h1:LapD9S96VoQRhi/GrNTqeBJFrUjs5UHCAtTlgwA5oZA=

View File

@ -5,14 +5,24 @@ import (
"bill-go-fiber/internal/label" "bill-go-fiber/internal/label"
"gorm.io/driver/sqlite" "gorm.io/driver/sqlite"
"gorm.io/gorm" "gorm.io/gorm"
"log"
"os"
) )
func ConnectToSqlite() (*gorm.DB, error) { func ConnectToSqlite() (*gorm.DB, error) {
dsn := "bill.db" var dsn string
//dsn := "file::memory:?cache=shared" switch os.Getenv("ENV") {
case "prod":
dsn = "bill.db"
default:
dsn = "file::memory:?cache=shared"
}
db, err := gorm.Open(sqlite.Open(dsn), &gorm.Config{}) db, err := gorm.Open(sqlite.Open(dsn), &gorm.Config{})
if err != nil { if err != nil {
panic("failed to connect database.\n") panic("failed to connect database.\n")
} else {
log.Println("Connecting to sqlite.")
} }
err = db.AutoMigrate(&label.Label{}) err = db.AutoMigrate(&label.Label{})
@ -24,7 +34,21 @@ func ConnectToSqlite() (*gorm.DB, error) {
panic("failed to migrate database.\n") panic("failed to migrate database.\n")
} }
db.Create(&label.Label{ID: 1, Name: "bill"}) // migrate data
if os.Getenv("ENV") != "prod" {
go func() {
sql, err := os.ReadFile("scripts/sqliteMigrations.sql")
if err != nil {
//panic("failed to read migration sql file: " + err.Error())
log.Fatal("failed to read migration sql file: " + err.Error())
}
res := db.Exec(string(sql))
if res.Error != nil {
log.Fatal("failed to migrate" + res.Error.Error())
}
log.Println("SQL migrated successfully!")
}()
}
return db, nil return db, nil
} }

View File

@ -12,6 +12,22 @@ type Label struct {
Count int Count int
} }
type LabelDTO struct {
ID int `json:"id"`
Type string `json:"type"`
Name string `json:"name"`
Count int `json:"count"`
}
func (l *Label) Dto() interface{} {
return LabelDTO{
ID: int(l.ID),
Type: l.Type,
Name: l.Name,
Count: l.Count,
}
}
type LabelRepository interface { type LabelRepository interface {
GetLabels(ctx context.Context) ([]Label, error) GetLabels(ctx context.Context) ([]Label, error)
GetLabelById(ctx context.Context, id int) (*Label, error) GetLabelById(ctx context.Context, id int) (*Label, error)
@ -21,8 +37,8 @@ type LabelRepository interface {
} }
type LabelService interface { type LabelService interface {
GetLabels(ctx context.Context) ([]Label, error) GetLabels(ctx context.Context) ([]interface{}, error)
GetLabelById(ctx context.Context, id int) (*Label, error) GetLabelById(ctx context.Context, id int) (interface{}, error)
CreateLabel(ctx context.Context, label *Label) error CreateLabel(ctx context.Context, label *Label) error
UpdateLabel(ctx context.Context, label *Label) error UpdateLabel(ctx context.Context, label *Label) error
DeleteLabel(ctx context.Context, id int) error DeleteLabel(ctx context.Context, id int) error

View File

@ -1,34 +0,0 @@
package label
import (
"context"
"github.com/gofiber/fiber/v2"
)
type LabelHandler struct {
labelService LabelService
}
func NewLabelHandler(labelRoute fiber.Router, ls LabelService) {
handler := &LabelHandler{
labelService: ls,
}
labelRoute.Get("", handler.getLabels)
}
func (h *LabelHandler) getLabels(c *fiber.Ctx) error {
customContext, cancel := context.WithCancel(context.Background())
defer cancel()
labels, err := h.labelService.GetLabels(customContext)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(&fiber.Map{
"status": "fail",
"message": err.Error(),
})
}
return c.Status(fiber.StatusOK).JSON(&fiber.Map{
"status": "success",
"data": labels,
})
}

137
internal/label/handler.go Normal file
View File

@ -0,0 +1,137 @@
package label
import (
"context"
"github.com/gofiber/fiber/v2"
"gorm.io/gorm"
)
type LabelHandler struct {
labelService LabelService
}
func NewLabelHandler(labelRoute fiber.Router, ls LabelService) {
handler := &LabelHandler{
labelService: ls,
}
labelRoute.Get("", handler.getLabels)
labelRoute.Post("", handler.createLabel)
labelRoute.Get("/:labelID", handler.getLabelById)
labelRoute.Put("/:labelID", handler.checkIfLabelExistsMiddleware, handler.updateLabel)
labelRoute.Delete("/:labelID", handler.checkIfLabelExistsMiddleware, handler.deleteLabel)
}
func (h *LabelHandler) getLabels(c *fiber.Ctx) error {
customContext, cancel := context.WithCancel(context.Background())
defer cancel()
labels, err := h.labelService.GetLabels(customContext)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(&fiber.Map{
"status": "fail",
"message": err.Error(),
})
}
return c.Status(fiber.StatusOK).JSON(&fiber.Map{
"status": "success",
"data": labels,
})
}
func (h *LabelHandler) createLabel(c *fiber.Ctx) error {
customContext, cancel := context.WithCancel(context.Background())
defer cancel()
label := &Label{}
if err := c.BodyParser(label); err != nil {
return c.Status(fiber.StatusBadRequest).JSON(&fiber.Map{
"status": "fail",
"message": err.Error(),
})
}
err := h.labelService.CreateLabel(customContext, label)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(&fiber.Map{
"status": "fail",
"message": err.Error(),
})
}
return c.Status(fiber.StatusOK).JSON(&fiber.Map{
"status": "success",
"message": "Label has been created successfully!",
})
}
func (h *LabelHandler) getLabelById(c *fiber.Ctx) error {
customContext, cancel := context.WithCancel(context.Background())
defer cancel()
targetLabelId, err := c.ParamsInt("labelID")
if err != nil {
return c.Status(fiber.StatusBadRequest).JSON(&fiber.Map{
"status": "fail",
"message": "Please provide a valid label id",
})
}
label, err := h.labelService.GetLabelById(customContext, targetLabelId)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(&fiber.Map{
"status": "fail",
"message": err.Error(),
})
}
return c.Status(fiber.StatusOK).JSON(&fiber.Map{
"status": "success",
"data": label,
})
}
func (h *LabelHandler) deleteLabel(c *fiber.Ctx) error {
customContext, cancel := context.WithCancel(context.Background())
defer cancel()
targetLabelId := c.Locals("labelID").(int)
err := h.labelService.DeleteLabel(customContext, targetLabelId)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(&fiber.Map{
"status": "fail",
"message": err.Error(),
})
}
return c.Status(fiber.StatusNoContent).JSON(&fiber.Map{
"status": "success",
"message": "Label has been deleted successfully",
})
}
func (h *LabelHandler) updateLabel(c *fiber.Ctx) error {
customContext, cancel := context.WithCancel(context.Background())
defer cancel()
targetLabelId := c.Locals("labelID").(int)
label := &Label{Model: gorm.Model{ID: uint(targetLabelId)}}
if err := c.BodyParser(label); err != nil {
return c.Status(fiber.StatusBadRequest).JSON(&fiber.Map{
"status": "fail",
"message": err.Error(),
})
}
err := h.labelService.UpdateLabel(customContext, label)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(&fiber.Map{
"status": "fail",
"message": err.Error(),
})
}
return c.Status(fiber.StatusOK).JSON(&fiber.Map{
"status": "success",
"message": "Label has been updated successfully!",
})
}

View File

@ -0,0 +1,37 @@
package label
import (
"context"
"github.com/gofiber/fiber/v2"
)
func (h *LabelHandler) checkIfLabelExistsMiddleware(c *fiber.Ctx) error {
customContext, cancel := context.WithCancel(context.Background())
defer cancel()
targetLabelID, err := c.ParamsInt("labelID")
if err != nil {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"status": "fail",
"message": "Please specify a valid label ID!",
})
}
searchLabel, err := h.labelService.GetLabelById(customContext, targetLabelID)
if err != nil {
return c.Status(fiber.StatusNotFound).JSON(fiber.Map{
"status": "fail",
"message": err.Error(),
})
}
if searchLabel == nil {
return c.Status(fiber.StatusNotFound).JSON(fiber.Map{
"status": "fail",
"message": "These is no label with this ID!",
})
}
c.Locals("labelID", targetLabelID)
return c.Next()
}

View File

@ -25,21 +25,23 @@ func (s *sqliteRepository) GetLabels(ctx context.Context) ([]Label, error) {
} }
func (s *sqliteRepository) GetLabelById(ctx context.Context, id int) (*Label, error) { func (s *sqliteRepository) GetLabelById(ctx context.Context, id int) (*Label, error) {
//TODO implement me var label Label
panic("implement me") res := s.First(&label, id)
if res.Error != nil {
return nil, res.Error
}
return &label, nil
} }
func (s *sqliteRepository) CreateLabel(ctx context.Context, label *Label) error { func (s *sqliteRepository) CreateLabel(ctx context.Context, label *Label) error {
//TODO implement me return s.Create(label).Error
panic("implement me")
} }
func (s *sqliteRepository) UpdateLabel(ctx context.Context, label *Label) error { func (s *sqliteRepository) UpdateLabel(ctx context.Context, label *Label) error {
//TODO implement me return s.Save(label).Error
panic("implement me")
} }
func (s *sqliteRepository) DeleteLabel(ctx context.Context, id int) error { func (s *sqliteRepository) DeleteLabel(ctx context.Context, id int) error {
//TODO implement me return s.Delete(&Label{}, id).Error
panic("implement me")
} }

View File

@ -2,6 +2,7 @@ package label
import ( import (
"context" "context"
"github.com/samber/lo"
) )
type labelService struct { type labelService struct {
@ -12,26 +13,29 @@ func NewLabelService(labelRepository LabelRepository) LabelService {
return &labelService{labelRepository: labelRepository} return &labelService{labelRepository: labelRepository}
} }
func (l *labelService) GetLabels(ctx context.Context) ([]Label, error) { func (l *labelService) GetLabels(ctx context.Context) ([]interface{}, error) {
return l.labelRepository.GetLabels(ctx) labels, err := l.labelRepository.GetLabels(ctx)
return lo.Map(labels, func(l Label, _ int) interface{} { return l.Dto() }), err
} }
func (l *labelService) GetLabelById(ctx context.Context, id int) (*Label, error) { func (l *labelService) GetLabelById(ctx context.Context, id int) (interface{}, error) {
//TODO implement me label, err := l.labelRepository.GetLabelById(ctx, id)
panic("implement me") if err != nil {
return nil, err
}
return label.Dto(), nil
} }
func (l *labelService) CreateLabel(ctx context.Context, label *Label) error { func (l *labelService) CreateLabel(ctx context.Context, label *Label) error {
//TODO implement me return l.labelRepository.CreateLabel(ctx, label)
panic("implement me")
} }
func (l *labelService) UpdateLabel(ctx context.Context, label *Label) error { func (l *labelService) UpdateLabel(ctx context.Context, label *Label) error {
//TODO implement me return l.labelRepository.UpdateLabel(ctx, label)
panic("implement me")
} }
func (l *labelService) DeleteLabel(ctx context.Context, id int) error { func (l *labelService) DeleteLabel(ctx context.Context, id int) error {
//TODO implement me return l.labelRepository.DeleteLabel(ctx, id)
panic("implement me")
} }

View File

@ -1,6 +1,10 @@
package misc package misc
import "github.com/gofiber/fiber/v2" import (
"github.com/gofiber/fiber/v2"
"os"
"time"
)
// Create a handler. Leave this empty, as we have no domains nor use-cases. // Create a handler. Leave this empty, as we have no domains nor use-cases.
type MiscHandler struct{} type MiscHandler struct{}
@ -11,6 +15,7 @@ func NewMiscHandler(miscRoute fiber.Router) {
// Declare routing. // Declare routing.
miscRoute.Get("", handler.healthCheck) miscRoute.Get("", handler.healthCheck)
miscRoute.Get("/shutdown", handler.shutdown)
} }
// Check for the health of the API. // Check for the health of the API.
@ -20,3 +25,14 @@ func (h *MiscHandler) healthCheck(c *fiber.Ctx) error {
"message": "Hello World!", "message": "Hello World!",
}) })
} }
func (h *MiscHandler) shutdown(ctx *fiber.Ctx) error {
go func() {
time.Sleep(1 * time.Second)
os.Exit(0)
}()
return ctx.Status(fiber.StatusOK).JSON(&fiber.Map{
"status": "success",
"message": "server shutdown",
})
}

View File

@ -3,7 +3,7 @@
API_URL=http://localhost:8080 API_URL=http://localhost:8080
# Introduction to the script. # Introduction to the script.
echo "Welcome to 'docker-mariadb-clean-arch' application!" echo "Welcome to 'bill-server' application!"
echo "Before running the end-to-end tests, please ensure that you have run 'make start'!"; echo echo "Before running the end-to-end tests, please ensure that you have run 'make start'!"; echo
# Testing '/api/v1'. # Testing '/api/v1'.
@ -12,73 +12,73 @@ echo "Running end-to-end testing..."
echo "Testing GET route '/api/v1'..." echo "Testing GET route '/api/v1'..."
curl $API_URL/api/v1; echo curl $API_URL/api/v1; echo
# Testing '/api/v1/users'. # Testing '/api/v1/labels'.
echo echo
echo "Testing GET route '/api/v1/users'..." echo "Testing GET route '/api/v1/labels'..."
curl $API_URL/api/v1/users; echo curl $API_URL/api/v1/labels; echo
echo echo
echo "Testing POST route '/api/v1/users'..." echo "Testing POST route '/api/v1/labels'..."
curl -X POST -H 'Content-Type: application/json' -d '{"name":"Lucy Heartfilia","address":"Shinhotaka, Japan"}' $API_URL/api/v1/users; echo curl -X POST -H 'Content-Type: application/json' -d '{"name":"Lucy Heartfilia","type":"income"}' $API_URL/api/v1/labels; echo
# Testing '/api/v1/users/:userID'. # Testing '/api/v1/labels/:labelID'.
echo echo
echo "Using 'userID' with value of 11 (the one created beforehand)." echo "Using 'labelID' with value of 3 (the one created beforehand)."
echo "Testing GET route '/api/v1/users/:userID'..." echo "Testing GET route '/api/v1/labels/:labelID'..."
curl $API_URL/api/v1/users/11; echo curl $API_URL/api/v1/labels/3; echo
echo echo
echo "Testing PUT route '/api/v1/users/:userID'..." echo "Testing PUT route '/api/v1/labels/:labelID'..."
curl -X PUT -H 'Content-Type: application/json' -d '{"name":"Mirajane Strauss","address":"Osaka, Japan"}' $API_URL/api/v1/users/11; echo curl -X PUT -H 'Content-Type: application/json' -d '{"name":"Mirajane Strauss","type":"consume"}' $API_URL/api/v1/labels/3; echo
echo echo
echo "Testing GET route after PUT '/api/v1/users/:userID'..." echo "Testing GET route after PUT '/api/v1/labels/:labelID'..."
curl $API_URL/api/v1/users/11; echo curl $API_URL/api/v1/labels/3; echo
echo echo
echo "Testing DELETE route '/api/v1/users/:userID'..." echo "Testing DELETE route '/api/v1/labels/:labelID'..."
curl -X DELETE $API_URL/api/v1/users/11; echo curl -X DELETE $API_URL/api/v1/labels/3; echo
echo echo
echo "Testing GET route after DELETE '/api/v1/users/:userID'..." echo "Testing GET route after DELETE '/api/v1/labels/:labelID'..."
curl $API_URL/api/v1/users/11; echo curl $API_URL/api/v1/labels/3; echo
# Testing '/api/v1/auth/login'. ## Testing '/api/v1/auth/login'.
echo #echo
echo "Testing POST route '/api/v1/auth/login'..." #echo "Testing POST route '/api/v1/auth/login'..."
curl -X POST -H 'Content-Type: application/json' -d '{"username":"fiber","password":"fiber"}' -c cookie.txt $API_URL/api/v1/auth/login; echo #curl -X POST -H 'Content-Type: application/json' -d '{"username":"fiber","password":"fiber"}' -c cookie.txt $API_URL/api/v1/auth/login; echo
#
# Testing '/api/v1/auth/private'. ## Testing '/api/v1/auth/private'.
echo #echo
echo "Testing GET route '/api/v1/auth/private'..." #echo "Testing GET route '/api/v1/auth/private'..."
curl -b cookie.txt $API_URL/api/v1/auth/private; echo #curl -b cookie.txt $API_URL/api/v1/auth/private; echo
#
# Testing '/api/v1/cities'. ## Testing '/api/v1/cities'.
echo #echo
echo "Testing GET route '/api/v1/cities'..." #echo "Testing GET route '/api/v1/cities'..."
curl -b cookie.txt $API_URL/api/v1/cities; echo #curl -b cookie.txt $API_URL/api/v1/cities; echo
echo #echo
echo "Testing POST route '/api/v1/cities'..." #echo "Testing POST route '/api/v1/cities'..."
curl -b cookie.txt -X POST -H 'Content-Type: application/json' -d '{"name":"Kyoto"}' $API_URL/api/v1/cities; echo #curl -b cookie.txt -X POST -H 'Content-Type: application/json' -d '{"name":"Kyoto"}' $API_URL/api/v1/cities; echo
#
# Testing '/api/v1/cities/:cityID'. ## Testing '/api/v1/cities/:cityID'.
echo #echo
echo "Using 'cityID' with value of 6 (the one created beforehand)." #echo "Using 'cityID' with value of 6 (the one created beforehand)."
echo "Testing GET route '/api/v1/cities/:cityID'..." #echo "Testing GET route '/api/v1/cities/:cityID'..."
curl -b cookie.txt $API_URL/api/v1/cities/6; echo #curl -b cookie.txt $API_URL/api/v1/cities/6; echo
echo #echo
echo "Testing PUT route '/api/v1/cities/:cityID'..." #echo "Testing PUT route '/api/v1/cities/:cityID'..."
curl -b cookie.txt -X PUT -H 'Content-Type: application/json' -d '{"name":"Osaka"}' $API_URL/api/v1/cities/6; echo #curl -b cookie.txt -X PUT -H 'Content-Type: application/json' -d '{"name":"Osaka"}' $API_URL/api/v1/cities/6; echo
echo #echo
echo "Testing GET route after PUT '/api/v1/cities/:cityID'..." #echo "Testing GET route after PUT '/api/v1/cities/:cityID'..."
curl -b cookie.txt $API_URL/api/v1/cities/6; echo #curl -b cookie.txt $API_URL/api/v1/cities/6; echo
echo #echo
echo "Testing DELETE route '/api/v1/cities/:cityID'..." #echo "Testing DELETE route '/api/v1/cities/:cityID'..."
curl -b cookie.txt -X DELETE $API_URL/api/v1/cities/6; echo #curl -b cookie.txt -X DELETE $API_URL/api/v1/cities/6; echo
echo #echo
echo "Testing GET route after DELETE '/api/v1/cities/:cityID'..." #echo "Testing GET route after DELETE '/api/v1/cities/:cityID'..."
curl -b cookie.txt $API_URL/api/v1/cities/6; echo #curl -b cookie.txt $API_URL/api/v1/cities/6; echo
#
# Testing '/api/v1/auth/logout'. ## Testing '/api/v1/auth/logout'.
echo #echo
echo "Testing POST route '/api/v1/auth/logout'..." #echo "Testing POST route '/api/v1/auth/logout'..."
curl -X POST $API_URL/api/v1/auth/logout; echo #curl -X POST $API_URL/api/v1/auth/logout; echo
#
# Finish end-to-end testing. ## Finish end-to-end testing.
rm cookie.txt #rm cookie.txt
echo "Finished testing the application!" #echo "Finished testing the application!"

View File

@ -0,0 +1,8 @@
INSERT INTO labels (id, type, name, count)
VALUES (1, '', 'bill', 0),
(2, '', 'bill', 0),
(3, '', 'bill', 0),
(4, '', 'bill', 0),
(5, '', 'bill', 0),
(6, '', 'bill', 0),
(7, '', 'bill', 0);