From 3d7e1dd0778902aa70f429d857570b06b27f9eae Mon Sep 17 00:00:00 2001 From: Reinaldy Rafli Date: Sat, 3 Sep 2022 17:53:46 +0700 Subject: [PATCH 1/9] feat: rewritten the most part of it --- api/Dockerfile | 17 +- api/core/administrator/id.go | 60 ----- api/core/administrator/id_test.go | 57 ----- api/core/administrator/init_test.go | 124 ---------- api/core/administrator/verify.go | 41 ---- api/core/administrator/verify_test.go | 70 ------ api/core/joke/getter.go | 209 +++++----------- api/core/joke/getter_test.go | 341 -------------------------- api/core/joke/init_test.go | 195 --------------- api/core/joke/joke.go | 11 + api/core/joke/jokes_test.go | 91 +++++++ api/core/joke/list.go | 66 +++++ api/core/joke/setter.go | 135 ---------- api/core/joke/setter_test.go | 238 ------------------ api/core/joke/today.go | 76 ++++++ api/core/joke/total.go | 66 +++++ api/core/joke/uploader.go | 27 ++ api/core/schema/joke.go | 6 +- api/core/schema/submit.go | 12 +- api/core/submit/getter.go | 115 --------- api/core/submit/getter_test.go | 91 ------- api/core/submit/init_test.go | 128 ---------- api/core/submit/setter.go | 122 --------- api/core/submit/setter_test.go | 25 -- api/core/validator/author.go | 25 -- api/core/validator/author_test.go | 40 --- api/core/validator/image.go | 30 --- api/core/validator/image_test.go | 50 ---- api/core/validator/joke.go | 69 ------ api/core/validator/submit.go | 38 --- api/go.mod | 44 ++-- api/go.sum | 141 +++-------- api/handler/health/health.go | 54 ++-- api/handler/joke/dependencies.go | 8 +- api/handler/joke/get.go | 63 +++++ api/handler/joke/joke_add.go | 69 ------ api/handler/joke/joke_delete.go | 51 ---- api/handler/joke/joke_get.go | 151 ------------ api/handler/joke/joke_total.go | 42 ---- api/handler/joke/joke_update.go | 86 ------- api/handler/joke/total.go | 21 ++ api/handler/submit/dependencies.go | 17 -- api/handler/submit/submit_add.go | 99 -------- api/handler/submit/submit_get.go | 28 --- api/main.go | 224 ++++++++--------- api/middleware/auth.go | 58 ----- api/middleware/schema.go | 12 - api/middleware/validation.go | 27 -- api/routes/dependencies.go | 19 -- api/routes/health.go | 21 +- api/routes/joke.go | 43 ++-- api/routes/submit.go | 33 --- api/samples/sample1.jpg | Bin 0 -> 93859 bytes api/samples/sample2.jpg | Bin 0 -> 54946 bytes api/samples/sample3.jpg | Bin 0 -> 87229 bytes api/samples/sample4.jpg | Bin 0 -> 43436 bytes api/samples/sample5.jpg | Bin 0 -> 107409 bytes 57 files changed, 723 insertions(+), 3163 deletions(-) delete mode 100644 api/core/administrator/id.go delete mode 100644 api/core/administrator/id_test.go delete mode 100644 api/core/administrator/init_test.go delete mode 100644 api/core/administrator/verify.go delete mode 100644 api/core/administrator/verify_test.go delete mode 100644 api/core/joke/getter_test.go delete mode 100644 api/core/joke/init_test.go create mode 100644 api/core/joke/joke.go create mode 100644 api/core/joke/jokes_test.go create mode 100644 api/core/joke/list.go delete mode 100644 api/core/joke/setter.go delete mode 100644 api/core/joke/setter_test.go create mode 100644 api/core/joke/today.go create mode 100644 api/core/joke/total.go create mode 100644 api/core/joke/uploader.go delete mode 100644 api/core/submit/getter.go delete mode 100644 api/core/submit/getter_test.go delete mode 100644 api/core/submit/init_test.go delete mode 100644 api/core/submit/setter.go delete mode 100644 api/core/submit/setter_test.go delete mode 100644 api/core/validator/author.go delete mode 100644 api/core/validator/author_test.go delete mode 100644 api/core/validator/image.go delete mode 100644 api/core/validator/image_test.go delete mode 100644 api/core/validator/joke.go delete mode 100644 api/core/validator/submit.go create mode 100644 api/handler/joke/get.go delete mode 100644 api/handler/joke/joke_add.go delete mode 100644 api/handler/joke/joke_delete.go delete mode 100644 api/handler/joke/joke_get.go delete mode 100644 api/handler/joke/joke_total.go delete mode 100644 api/handler/joke/joke_update.go create mode 100644 api/handler/joke/total.go delete mode 100644 api/handler/submit/dependencies.go delete mode 100644 api/handler/submit/submit_add.go delete mode 100644 api/handler/submit/submit_get.go delete mode 100644 api/middleware/auth.go delete mode 100644 api/middleware/schema.go delete mode 100644 api/middleware/validation.go delete mode 100644 api/routes/dependencies.go delete mode 100644 api/routes/submit.go create mode 100644 api/samples/sample1.jpg create mode 100644 api/samples/sample2.jpg create mode 100644 api/samples/sample3.jpg create mode 100644 api/samples/sample4.jpg create mode 100644 api/samples/sample5.jpg diff --git a/api/Dockerfile b/api/Dockerfile index b0c07de..e5cf156 100644 --- a/api/Dockerfile +++ b/api/Dockerfile @@ -1,12 +1,21 @@ -FROM golang:1.17-buster +FROM golang:1.19.0-bullseye AS builder WORKDIR /app COPY . . -RUN go mod download -RUN go build -v main.go +RUN go build -o main . + +FROM debian:bullseye AS runtime + +WORKDIR /app + +COPY --from=builder /app/main . + +ENV PORT=5000 +ENV HOSTNAME=0.0.0.0 +ENV ENVIRONMENT=production EXPOSE ${PORT} -CMD ["./main"] \ No newline at end of file +ENTRYPOINT [ "/app/main" ] \ No newline at end of file diff --git a/api/core/administrator/id.go b/api/core/administrator/id.go deleted file mode 100644 index 35d9e54..0000000 --- a/api/core/administrator/id.go +++ /dev/null @@ -1,60 +0,0 @@ -package administrator - -import ( - "context" - "time" - - "github.com/Masterminds/squirrel" - "github.com/jackc/pgx/v4/pgxpool" -) - -func GetUserID(db *pgxpool.Pool, ctx context.Context, key string) (int, error) { - var query = squirrel.StatementBuilder.PlaceholderFormat(squirrel.Dollar) - - c, err := db.Acquire(ctx) - if err != nil { - return 0, err - } - defer c.Release() - - tx, err := c.Begin(ctx) - if err != nil { - return 0, err - } - defer tx.Rollback(ctx) - - sql, args, err := query. - Update("administrators"). - Set("last_used", time.Now().UTC().Format(time.RFC3339)). - ToSql() - if err != nil { - return 0, err - } - - _, err = tx.Exec(ctx, sql, args...) - if err != nil { - return 0, err - } - - sql, args, err = query. - Select("id"). - From("administrators"). - Where(squirrel.Eq{"key": key}). - ToSql() - if err != nil { - return 0, err - } - - var id int - err = tx.QueryRow(ctx, sql, args...).Scan(&id) - if err != nil { - return 0, err - } - - err = tx.Commit(ctx) - if err != nil { - return 0, err - } - - return id, nil -} diff --git a/api/core/administrator/id_test.go b/api/core/administrator/id_test.go deleted file mode 100644 index 7549513..0000000 --- a/api/core/administrator/id_test.go +++ /dev/null @@ -1,57 +0,0 @@ -package administrator_test - -import ( - "context" - "jokes-bapak2-api/core/administrator" - "testing" - "time" -) - -func TestGetUserID_Success(t *testing.T) { - ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(30*time.Second)) - defer cancel() - - defer Flush() - - c, err := db.Acquire(ctx) - if err != nil { - t.Error("an error was thrown:", err) - } - defer c.Release() - - _, err = c.Exec( - ctx, - `INSERT INTO administrators (id, key, token, last_used) VALUES ($1, $2, $3, $4)`, - administratorsData..., - ) - if err != nil { - t.Error("an error was thrown:", err) - } - - id, err := administrator.GetUserID(db, ctx, "very secure") - if err != nil { - t.Error("an error was thrown:", err) - } - - if id != 1 { - t.Error("id is not correct, want: 1, got:", id) - } -} - -func TestGetUserID_Failed(t *testing.T) { - ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(30*time.Second)) - defer cancel() - - defer Flush() - - c, err := db.Acquire(ctx) - if err != nil { - t.Error("an error was thrown:", err) - } - defer c.Release() - - id, err := administrator.GetUserID(db, ctx, "very secure") - if err == nil { - t.Error("an error was expected, got:", id) - } -} diff --git a/api/core/administrator/init_test.go b/api/core/administrator/init_test.go deleted file mode 100644 index a29863e..0000000 --- a/api/core/administrator/init_test.go +++ /dev/null @@ -1,124 +0,0 @@ -package administrator_test - -import ( - "context" - "os" - "testing" - "time" - - "github.com/jackc/pgx/v4/pgxpool" -) - -var db *pgxpool.Pool - -var administratorsData = []interface{}{ - 1, "very secure", "not the real one", time.Now().Format(time.RFC3339), -} - -func TestMain(m *testing.M) { - defer Teardown() - Setup() - - os.Exit(m.Run()) -} - -func Setup() { - ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(1*time.Minute)) - defer cancel() - - poolConfig, err := pgxpool.ParseConfig(os.Getenv("DATABASE_URL")) - if err != nil { - panic(err) - } - - db, err = pgxpool.ConnectConfig(ctx, poolConfig) - if err != nil { - panic(err) - } - - conn, err := db.Acquire(ctx) - if err != nil { - panic(err) - } - defer conn.Release() - tx, err := conn.Begin(ctx) - if err != nil { - panic(err) - } - defer tx.Rollback(ctx) - - _, err = tx.Exec( - ctx, - `CREATE TABLE IF NOT EXISTS administrators ( - id SERIAL PRIMARY KEY, - key VARCHAR(255) NOT NULL UNIQUE, - token TEXT, - last_used VARCHAR(255) - )`, - ) - if err != nil { - panic(err) - } - - err = tx.Commit(ctx) - if err != nil { - panic(err) - } -} - -func Teardown() (err error) { - ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(1*time.Minute)) - defer cancel() - - defer db.Close() - - c, err := db.Acquire(ctx) - if err != nil { - return err - } - defer c.Release() - - tx, err := c.Begin(ctx) - if err != nil { - return err - } - defer tx.Rollback(ctx) - - _, err = tx.Exec(ctx, "TRUNCATE TABLE submission RESTART IDENTITY CASCADE") - if err != nil { - return err - } - _, err = tx.Exec(ctx, "TRUNCATE TABLE jokesbapak2 RESTART IDENTITY CASCADE") - if err != nil { - return err - } - _, err = tx.Exec(ctx, "TRUNCATE TABLE administrators RESTART IDENTITY CASCADE") - if err != nil { - return err - } - - err = tx.Commit(ctx) - if err != nil { - return err - } - - return -} - -func Flush() error { - ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(30*time.Second)) - defer cancel() - - conn, err := db.Acquire(ctx) - if err != nil { - return err - } - defer conn.Release() - - _, err = conn.Exec(ctx, "TRUNCATE TABLE administrators RESTART IDENTITY CASCADE") - if err != nil { - return err - } - - return nil -} diff --git a/api/core/administrator/verify.go b/api/core/administrator/verify.go deleted file mode 100644 index bf60026..0000000 --- a/api/core/administrator/verify.go +++ /dev/null @@ -1,41 +0,0 @@ -package administrator - -import ( - "context" - "errors" - - "github.com/Masterminds/squirrel" - "github.com/jackc/pgx/v4" - "github.com/jackc/pgx/v4/pgxpool" -) - -func CheckKeyExists(db *pgxpool.Pool, ctx context.Context, key string) (string, error) { - conn, err := db.Acquire(ctx) - if err != nil { - return "", err - } - defer conn.Release() - - var query = squirrel.StatementBuilder.PlaceholderFormat(squirrel.Dollar) - - // Check if key exists - sql, args, err := query. - Select("token"). - From("administrators"). - Where(squirrel.Eq{"key": key}). - ToSql() - if err != nil { - return "", err - } - - var token string - err = conn.QueryRow(ctx, sql, args...).Scan(&token) - if err != nil { - if errors.Is(err, pgx.ErrNoRows) { - return "", nil - } - return "", err - } - - return token, nil -} diff --git a/api/core/administrator/verify_test.go b/api/core/administrator/verify_test.go deleted file mode 100644 index 6e21672..0000000 --- a/api/core/administrator/verify_test.go +++ /dev/null @@ -1,70 +0,0 @@ -package administrator_test - -import ( - "context" - "jokes-bapak2-api/core/administrator" - "testing" - "time" -) - -func TestCheckKeyExists_Success(t *testing.T) { - ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(30*time.Second)) - defer cancel() - - defer Flush() - - c, err := db.Acquire(ctx) - if err != nil { - t.Error("an error was thrown:", err) - } - defer c.Release() - - _, err = c.Exec( - ctx, - "INSERT INTO administrators (id, key, token, last_used) VALUES ($1, $2, $3, $4)", - administratorsData..., - ) - if err != nil { - t.Error("an error was thrown:", err) - } - - key, err := administrator.CheckKeyExists(db, ctx, "very secure") - if err != nil { - t.Error("an error was thrown:", err) - } - - if key != "not the real one" { - t.Error("key isn't not the real one, got:", key) - } -} - -func TestCheckKeyExists_Failing(t *testing.T) { - ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(30*time.Second)) - defer cancel() - - defer Flush() - - c, err := db.Acquire(ctx) - if err != nil { - t.Error("an error was thrown:", err) - } - defer c.Release() - - _, err = c.Exec( - ctx, - "INSERT INTO administrators (id, key, token, last_used) VALUES ($1, $2, $3, $4)", - administratorsData..., - ) - if err != nil { - t.Error("an error was thrown:", err) - } - - key, err := administrator.CheckKeyExists(db, ctx, "others") - if err != nil { - t.Error("an error was thrown:", err) - } - - if key != "" { - t.Error("key is not empty, got:", key) - } -} diff --git a/api/core/joke/getter.go b/api/core/joke/getter.go index 4ca97f9..3d0b3f2 100644 --- a/api/core/joke/getter.go +++ b/api/core/joke/getter.go @@ -2,185 +2,96 @@ package joke import ( "context" + "encoding/hex" "errors" - "jokes-bapak2-api/core/schema" + "fmt" + "io" + "log" "math/rand" "strconv" + "time" - "github.com/Masterminds/squirrel" "github.com/allegro/bigcache/v3" - "github.com/georgysavva/scany/pgxscan" - "github.com/jackc/pgx" - "github.com/jackc/pgx/v4/pgxpool" - "github.com/pquerna/ffjson/ffjson" + "github.com/go-redis/redis/v8" + "github.com/minio/minio-go/v7" ) -// GetAllJSONJokes fetch the database for all the jokes then output it as a JSON []byte. -// Keep in mind, you will need to store it to memory yourself. -func GetAllJSONJokes(db *pgxpool.Pool, ctx context.Context) ([]byte, error) { - conn, err := db.Acquire(ctx) +func GetRandomJoke(ctx context.Context, bucket *minio.Client, cache *redis.Client, memory *bigcache.BigCache) (image []byte, contentType string, err error) { + totalJokes, err := GetTotalJoke(ctx, bucket, cache, memory) if err != nil { - return []byte{}, err - } - defer conn.Release() - - var jokes []schema.Joke - results, err := conn.Query(ctx, "SELECT \"id\",\"link\" FROM \"jokesbapak2\" ORDER BY \"id\"") - if err != nil { - return nil, err - } - defer results.Close() - - err = pgxscan.ScanAll(&jokes, results) - if err != nil { - return nil, err + return []byte{}, "", fmt.Errorf("getting total joke: %w", err) } - data, err := ffjson.Marshal(jokes) + randomIndex := rand.Intn(totalJokes - 1) + + joke, contentType, err := GetJokeById(ctx, bucket, cache, memory, randomIndex) if err != nil { - return nil, err + return []byte{}, "", fmt.Errorf("getting joke by id: %w", err) } - return data, nil + return joke, contentType, nil } -// Only return a link -func GetRandomJokeFromDB(db *pgxpool.Pool, ctx context.Context) (string, error) { - conn, err := db.Acquire(ctx) - if err != nil { - return "", err - } - defer conn.Release() - - var link string - err = conn.QueryRow(ctx, "SELECT link FROM jokesbapak2 ORDER BY random() LIMIT 1").Scan(&link) - if err != nil { - return "", err +func GetJokeById(ctx context.Context, bucket *minio.Client, cache *redis.Client, memory *bigcache.BigCache, id int) (image []byte, contentType string, err error) { + jokeFromMemory, err := memory.Get("id:" + strconv.Itoa(id)) + if err != nil && !errors.Is(err, bigcache.ErrEntryNotFound) { + return []byte{}, "", fmt.Errorf("acquiring joke from memory: %w", err) } - return link, nil -} + if err == nil { + return jokeFromMemory, "", nil + } -// GetRandomJokeFromCache returns a link string of a random joke from cache. -func GetRandomJokeFromCache(memory *bigcache.BigCache) (string, error) { - jokes, err := memory.Get("jokes") + jokeFromCache, err := cache.Get(ctx, "jokes:id:"+strconv.Itoa(id)).Result() if err != nil { - if errors.Is(err, bigcache.ErrEntryNotFound) { - return "", schema.ErrNotFound + // Decode hex string to bytes + imageBytes, err := hex.DecodeString(jokeFromCache) + if err != nil { + return []byte{}, "", fmt.Errorf("decoding hex string: %w", err) } - return "", err + + defer func(id int, imageBytes []byte) { + err := memory.Set("id:"+strconv.Itoa(id), imageBytes) + if err != nil { + log.Printf("setting memory cache: %s", err.Error()) + } + }(id, imageBytes) + + return imageBytes, "", nil } - var data []schema.Joke - err = ffjson.Unmarshal(jokes, &data) + jokes, err := ListJokesFromBucket(ctx, bucket, cache) if err != nil { - return "", nil + return []byte{}, "", fmt.Errorf("listing jokes: %w", err) } - // Return an error if the database is empty - dataLength := len(data) - if dataLength == 0 { - return "", schema.ErrEmpty - } - - random := rand.Intn(dataLength) - joke := data[random].Link - - return joke, nil -} - -// CheckJokesCache checks if there is some value inside jokes cache. -func CheckJokesCache(memory *bigcache.BigCache) (bool, error) { - _, err := memory.Get("jokes") + object, err := bucket.GetObject(ctx, JokesBapak2Bucket, jokes[id].FileName, minio.GetObjectOptions{}) if err != nil { - if errors.Is(err, bigcache.ErrEntryNotFound) { - return false, nil + return []byte{}, "", fmt.Errorf("getting object: %w", err) + } + defer func() { + err := object.Close() + if err != nil { + log.Printf("closing image reader: %s", err.Error()) } - return false, err + }() + + image, err = io.ReadAll(object) + if err != nil { + return []byte{}, "", fmt.Errorf("reading object: %w", err) } - return true, nil -} + defer func(id int, image []byte) { + ctx, cancel := context.WithTimeout(context.Background(), time.Minute) + defer cancel() -// CheckTotalJokesCache literally does what the name is for -func CheckTotalJokesCache(memory *bigcache.BigCache) (bool, error) { - _, err := memory.Get("total") - if err != nil { - if errors.Is(err, bigcache.ErrEntryNotFound) { - return false, nil + imageString := hex.EncodeToString(image) + + err := cache.Set(ctx, "jokes:id:"+strconv.Itoa(id), imageString, time.Hour*1).Err() + if err != nil { + log.Printf("setting cache: %s", err.Error()) } - return false, err - } + }(id, image) - return true, nil -} - -// GetCachedJokeByID returns a link string of a certain ID from cache. -func GetCachedJokeByID(memory *bigcache.BigCache, id int) (string, error) { - jokes, err := memory.Get("jokes") - if err != nil { - if errors.Is(err, bigcache.ErrEntryNotFound) { - return "", schema.ErrNotFound - } - return "", err - } - - var data []schema.Joke - err = ffjson.Unmarshal(jokes, &data) - if err != nil { - return "", err - } - - // This is a simple solution, might convert it to goroutines and channels sometime soon. - for _, v := range data { - if v.ID == id { - return v.Link, nil - } - } - - return "", nil -} - -// GetCachedTotalJokes -func GetCachedTotalJokes(memory *bigcache.BigCache) (int, error) { - total, err := memory.Get("total") - if err != nil { - if errors.Is(err, bigcache.ErrEntryNotFound) { - return 0, schema.ErrNotFound - } - return 0, err - } - i, err := strconv.Atoi(string(total)) - if err != nil { - return 0, err - } - - return i, nil -} - -func CheckJokeExists(db *pgxpool.Pool, ctx context.Context, id string) (bool, error) { - conn, err := db.Acquire(ctx) - if err != nil { - return false, err - } - defer conn.Release() - - var query = squirrel.StatementBuilder.PlaceholderFormat(squirrel.Dollar) - - sql, args, err := query. - Select("id"). - From("jokesbapak2"). - Where(squirrel.Eq{"id": id}). - ToSql() - if err != nil { - return false, err - } - - var jokeID int - err = conn.QueryRow(ctx, sql, args...).Scan(&jokeID) - if err != nil && errors.Is(err, pgx.ErrNoRows) { - return false, err - } - - return strconv.Itoa(jokeID) == id, nil + return image, jokes[id].ContentType, nil } diff --git a/api/core/joke/getter_test.go b/api/core/joke/getter_test.go deleted file mode 100644 index 54783bb..0000000 --- a/api/core/joke/getter_test.go +++ /dev/null @@ -1,341 +0,0 @@ -package joke_test - -import ( - "context" - "encoding/json" - "jokes-bapak2-api/core/joke" - "jokes-bapak2-api/core/schema" - "testing" - "time" - - "github.com/jackc/pgx/v4" -) - -func TestGetAllJSONJokes(t *testing.T) { - ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(30*time.Second)) - defer cancel() - - defer Flush() - - conn, err := db.Acquire(ctx) - if err != nil { - t.Error("an error was thrown:", err) - } - defer conn.Release() - - err = conn.BeginFunc(ctx, func(t pgx.Tx) error { - _, err := t.Exec( - ctx, - `INSERT INTO "administrators" - (id, key, token, last_used) - VALUES - ($1, $2, $3, $4), - ($5, $6, $7, $8)`, - administratorsData..., - ) - if err != nil { - return err - } - _, err = t.Exec( - ctx, - `INSERT INTO "jokesbapak2" - (id, link, creator) - VALUES - ($1, $2, $3), - ($4, $5, $6), - ($7, $8, $9)`, - jokesData..., - ) - if err != nil { - return err - } - - return nil - }) - if err != nil { - t.Error("an error was thrown:", err) - } - - j, err := joke.GetAllJSONJokes(db, ctx) - if err != nil { - t.Error("an error was thrown:", err) - } - - if string(j) == "" { - t.Error("j should not be empty") - } -} - -func TestGetRandomJokeFromDB(t *testing.T) { - ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(30*time.Second)) - defer cancel() - - defer Flush() - - conn, err := db.Acquire(ctx) - if err != nil { - t.Error("an error was thrown:", err) - } - defer conn.Release() - - err = conn.BeginFunc(ctx, func(t pgx.Tx) error { - _, err := t.Exec( - ctx, - `INSERT INTO "administrators" - (id, key, token, last_used) - VALUES - ($1, $2, $3, $4), - ($5, $6, $7, $8)`, - administratorsData..., - ) - if err != nil { - return err - } - _, err = t.Exec( - ctx, - `INSERT INTO "jokesbapak2" - (id, link, creator) - VALUES - ($1, $2, $3), - ($4, $5, $6), - ($7, $8, $9)`, - jokesData..., - ) - if err != nil { - return err - } - - return nil - }) - if err != nil { - t.Error("an error was thrown:", err) - } - - j, err := joke.GetRandomJokeFromDB(db, ctx) - if err != nil { - t.Error("an error was thrown:", err) - } - - if j == "" { - t.Error("j should not be empty") - } -} - -func TestGetRandomJokeFromCache(t *testing.T) { - defer Flush() - - jokes := []schema.Joke{ - {ID: 1, Link: "link1", Creator: 1}, - {ID: 2, Link: "link2", Creator: 1}, - {ID: 3, Link: "link3", Creator: 1}, - } - data, err := json.Marshal(jokes) - if err != nil { - t.Error("an error was thrown:", err) - } - - err = memory.Set("jokes", data) - if err != nil { - t.Error("an error was thrown:", err) - } - - j, err := joke.GetRandomJokeFromCache(memory) - if err != nil { - t.Error("an error was thrown:", err) - } - - if j == "" { - t.Error("j should not be empty") - } -} - -func TestCheckJokesCache_True(t *testing.T) { - defer Flush() - - jokes := []schema.Joke{ - {ID: 1, Link: "link1", Creator: 1}, - {ID: 2, Link: "link2", Creator: 1}, - {ID: 3, Link: "link3", Creator: 1}, - } - data, err := json.Marshal(jokes) - if err != nil { - t.Error("an error was thrown:", err) - } - - err = memory.Set("jokes", data) - if err != nil { - t.Error("an error was thrown:", err) - } - - j, err := joke.CheckJokesCache(memory) - if err != nil { - t.Error("an error was thrown:", err) - } - - if j == false { - t.Error("j should not be false") - } -} - -func TestCheckJokesCache_False(t *testing.T) { - defer Flush() - - j, err := joke.CheckJokesCache(memory) - if err != nil { - t.Error("an error was thrown:", err) - } - - if j == true { - t.Error("j should not be true") - } -} - -func TestCheckTotalJokesCache_True(t *testing.T) { - defer Flush() - - err := memory.Set("total", []byte("10")) - if err != nil { - t.Error("an error was thrown:", err) - } - - j, err := joke.CheckTotalJokesCache(memory) - if err != nil { - t.Error("an error was thrown:", err) - } - - if j == false { - t.Error("j should not be false") - } -} - -func TestCheckTotalJokesCache_False(t *testing.T) { - defer Flush() - - j, err := joke.CheckTotalJokesCache(memory) - if err != nil { - t.Error("an error was thrown:", err) - } - - if j == true { - t.Error("j should not be true") - } -} - -func TestGetCachedJokeByID(t *testing.T) { - defer Flush() - - jokes := []schema.Joke{ - {ID: 1, Link: "link1", Creator: 1}, - {ID: 2, Link: "link2", Creator: 1}, - {ID: 3, Link: "link3", Creator: 1}, - } - data, err := json.Marshal(jokes) - if err != nil { - t.Error("an error was thrown:", err) - } - - err = memory.Set("jokes", data) - if err != nil { - t.Error("an error was thrown:", err) - } - - j, err := joke.GetCachedJokeByID(memory, 1) - if err != nil { - t.Error("an error was thrown:", err) - } - - if j != "link1" { - t.Error("j should be link1, got:", j) - } - - k, err := joke.GetCachedJokeByID(memory, 4) - if err != nil { - t.Error("an error was thrown:", err) - } - - if k != "" { - t.Error("k should be empty, got:", k) - } -} - -func TestGetCachedTotalJokes(t *testing.T) { - defer Flush() - - err := memory.Set("total", []byte("10")) - if err != nil { - t.Error("an error was thrown:", err) - } - - j, err := joke.GetCachedTotalJokes(memory) - if err != nil { - t.Error("an error was thrown:", err) - } - - if j != 10 { - t.Error("j should be 10, got:", j) - } -} - -func TestCheckJokeExists(t *testing.T) { - ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(30*time.Second)) - defer cancel() - - defer Flush() - - conn, err := db.Acquire(ctx) - if err != nil { - t.Error("an error was thrown:", err) - } - defer conn.Release() - - err = conn.BeginFunc(ctx, func(t pgx.Tx) error { - _, err := t.Exec( - ctx, - `INSERT INTO "administrators" - (id, key, token, last_used) - VALUES - ($1, $2, $3, $4), - ($5, $6, $7, $8)`, - administratorsData..., - ) - if err != nil { - return err - } - _, err = t.Exec( - ctx, - `INSERT INTO "jokesbapak2" - (id, link, creator) - VALUES - ($1, $2, $3), - ($4, $5, $6), - ($7, $8, $9)`, - jokesData..., - ) - if err != nil { - return err - } - - return nil - }) - if err != nil { - t.Error("an error was thrown:", err) - } - - j, err := joke.CheckJokeExists(db, ctx, "1") - if err != nil { - t.Error("an error was thrown:", err) - } - - if j == false { - t.Error("j should not be false") - } - - k, err := joke.CheckJokeExists(db, ctx, "4") - if err != nil { - t.Error("an error was thrown:", err) - } - - if k == true { - t.Error("k should not be true") - } -} diff --git a/api/core/joke/init_test.go b/api/core/joke/init_test.go deleted file mode 100644 index 34a4e65..0000000 --- a/api/core/joke/init_test.go +++ /dev/null @@ -1,195 +0,0 @@ -package joke_test - -import ( - "context" - "os" - "testing" - "time" - - "github.com/allegro/bigcache/v3" - "github.com/go-redis/redis/v8" - "github.com/jackc/pgx/v4/pgxpool" -) - -var db *pgxpool.Pool -var cache *redis.Client -var memory *bigcache.BigCache - -var jokesData = []interface{}{ - 1, "https://via.placeholder.com/300/06f/fff.png", 1, - 2, "https://via.placeholder.com/300/07f/fff.png", 1, - 3, "https://via.placeholder.com/300/08f/fff.png", 1, -} -var administratorsData = []interface{}{ - 1, "very secure", "not the real one", time.Now().Format(time.RFC3339), 2, "test", "$argon2id$v=19$m=65536,t=16,p=4$3a08c79fbf2222467a623df9a9ebf75802c65a4f9be36eb1df2f5d2052d53cb7$ce434bd38f7ba1fc1f2eb773afb8a1f7f2dad49140803ac6cb9d7256ce9826fb3b4afa1e2488da511c852fc6c33a76d5657eba6298a8e49d617b9972645b7106", "", -} - -func TestMain(m *testing.M) { - defer Teardown() - Setup() - time.Sleep(3 * time.Second) - - os.Exit(m.Run()) -} - -func Setup() { - ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(1*time.Minute)) - defer cancel() - - poolConfig, err := pgxpool.ParseConfig(os.Getenv("DATABASE_URL")) - if err != nil { - panic(err) - } - - db, err = pgxpool.ConnectConfig(ctx, poolConfig) - if err != nil { - panic(err) - } - - opt, err := redis.ParseURL(os.Getenv("REDIS_URL")) - if err != nil { - panic(err) - } - - cache = redis.NewClient(opt) - - memory, err = bigcache.NewBigCache(bigcache.DefaultConfig(6 * time.Hour)) - if err != nil { - panic(err) - } - - conn, err := db.Acquire(ctx) - if err != nil { - panic(err) - } - defer conn.Release() - - tx, err := conn.Begin(ctx) - if err != nil { - panic(err) - } - defer tx.Rollback(ctx) - - _, err = tx.Exec( - ctx, - `CREATE TABLE IF NOT EXISTS administrators ( - id SERIAL PRIMARY KEY, - key VARCHAR(255) NOT NULL UNIQUE, - token TEXT, - last_used VARCHAR(255) - )`, - ) - if err != nil { - panic(err) - } - - _, err = tx.Exec( - ctx, - `CREATE TABLE IF NOT EXISTS jokesbapak2 ( - id SERIAL PRIMARY KEY, - link TEXT UNIQUE, - creator INT NOT NULL REFERENCES "administrators" ("id") - )`, - ) - if err != nil { - panic(err) - } - _, err = tx.Exec( - ctx, - `CREATE TABLE IF NOT EXISTS submission ( - id SERIAL PRIMARY KEY, - link VARCHAR(255) UNIQUE NOT NULL, - created_at VARCHAR(255), - author VARCHAR(255) NOT NULL, - status SMALLINT DEFAULT 0 - )`, - ) - if err != nil { - panic(err) - } - - err = tx.Commit(ctx) - if err != nil { - panic(err) - } -} - -func Teardown() (err error) { - ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(30*time.Second)) - defer cancel() - - defer db.Close() - - conn, err := db.Acquire(ctx) - if err != nil { - return err - } - defer conn.Release() - - tx, err := conn.Begin(ctx) - if err != nil { - return err - } - defer tx.Rollback(ctx) - - _, err = tx.Exec(ctx, "TRUNCATE TABLE submission RESTART IDENTITY CASCADE") - if err != nil { - return err - } - _, err = tx.Exec(ctx, "TRUNCATE TABLE jokesbapak2 RESTART IDENTITY CASCADE") - if err != nil { - return err - } - _, err = tx.Exec(ctx, "TRUNCATE TABLE administrators RESTART IDENTITY CASCADE") - if err != nil { - return err - } - - err = tx.Commit(ctx) - if err != nil { - return err - } - - err = cache.Close() - if err != nil { - return - } - err = memory.Close() - return -} - -func Flush() error { - ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(30*time.Second)) - defer cancel() - - conn, err := db.Acquire(ctx) - if err != nil { - return err - } - defer conn.Release() - - _, err = conn.Exec(ctx, "TRUNCATE TABLE submission RESTART IDENTITY CASCADE") - if err != nil { - return err - } - _, err = conn.Exec(ctx, "TRUNCATE TABLE jokesbapak2 RESTART IDENTITY CASCADE") - if err != nil { - return err - } - _, err = conn.Exec(ctx, "TRUNCATE TABLE administrators RESTART IDENTITY CASCADE") - if err != nil { - return err - } - - err = cache.FlushAll(ctx).Err() - if err != nil { - return err - } - - err = memory.Reset() - if err != nil { - return err - } - - return nil -} diff --git a/api/core/joke/joke.go b/api/core/joke/joke.go new file mode 100644 index 0000000..0e475cb --- /dev/null +++ b/api/core/joke/joke.go @@ -0,0 +1,11 @@ +package joke + +import "time" + +const JokesBapak2Bucket = "jokesbapak2" + +type Joke struct { + FileName string + ContentType string + ModifiedAt time.Time +} diff --git a/api/core/joke/jokes_test.go b/api/core/joke/jokes_test.go new file mode 100644 index 0000000..56fd0e7 --- /dev/null +++ b/api/core/joke/jokes_test.go @@ -0,0 +1,91 @@ +package joke_test + +import ( + "context" + "log" + "os" + "testing" + "time" + + "github.com/allegro/bigcache/v3" + "github.com/go-redis/redis/v8" + "github.com/minio/minio-go/v7" + "github.com/minio/minio-go/v7/pkg/credentials" +) + +var bucket *minio.Client +var cache *redis.Client +var memory *bigcache.BigCache + +func TestMain(m *testing.M) { + redisUrl, ok := os.LookupEnv("REDIS_URL") + if !ok { + redisUrl = "redis://@localhost:6379" + } + + minioHost, ok := os.LookupEnv("MINIO_HOST") + if !ok { + minioHost = "localhost:9000" + } + + minioID, ok := os.LookupEnv("MINIO_ACCESS_ID") + if !ok { + minioID = "minio" + } + + minioSecret, ok := os.LookupEnv("MINIO_SECRET_KEY") + if !ok { + minioSecret = "password" + } + + minioToken, ok := os.LookupEnv("MINIO_TOKEN") + if !ok { + minioToken = "" + } + + parsedRedisUrl, err := redis.ParseURL(redisUrl) + if err != nil { + log.Fatalf("parsing redis url: %s", err.Error()) + return + } + + redisClient := redis.NewClient(parsedRedisUrl) + + minioClient, err := minio.New(minioHost, &minio.Options{ + Creds: credentials.NewStaticV4(minioID, minioSecret, minioToken), + }) + if err != nil { + log.Fatalf("creating minio client: %s", err.Error()) + } + + memoryInstance, err := bigcache.NewBigCache(bigcache.DefaultConfig(time.Second * 30)) + if err != nil { + log.Fatalf("creating bigcache client: %s", err.Error()) + } + + bucket = minioClient + cache = redisClient + memory = memoryInstance + + exitCode := m.Run() + + cleanupCtx, cleanupCancel := context.WithTimeout(context.Background(), time.Minute) + defer cleanupCancel() + + err = redisClient.FlushAll(cleanupCtx).Err() + if err != nil { + log.Printf("flushing redis: %s", err.Error()) + } + + err = cache.Close() + if err != nil { + log.Printf("closing cache client: %s", err.Error()) + } + + err = redisClient.Close() + if err != nil { + log.Printf("closing redis client: %s", err.Error()) + } + + os.Exit(exitCode) +} diff --git a/api/core/joke/list.go b/api/core/joke/list.go new file mode 100644 index 0000000..67b5578 --- /dev/null +++ b/api/core/joke/list.go @@ -0,0 +1,66 @@ +package joke + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "log" + "sort" + "time" + + "github.com/go-redis/redis/v8" + "github.com/minio/minio-go/v7" +) + +func ListJokesFromBucket(ctx context.Context, bucket *minio.Client, cache *redis.Client) ([]Joke, error) { + cached, err := cache.Get(ctx, "jokes:list").Result() + if err != nil && !errors.Is(err, redis.Nil) { + return []Joke{}, fmt.Errorf("acquiring joke list from cache: %w", err) + } + + if err == nil { + var jokes []Joke + err := json.Unmarshal([]byte(cached), &jokes) + if err != nil { + return []Joke{}, fmt.Errorf("unmarshalling json: %w", err) + } + + return jokes, nil + } + + objects := bucket.ListObjects(ctx, JokesBapak2Bucket, minio.ListObjectsOptions{Recursive: true}) + + var jokes []Joke + for object := range objects { + if object.Err != nil { + return []Joke{}, fmt.Errorf("enumerating objects: %w", object.Err) + } + + if !object.IsDeleteMarker { + jokes = append(jokes, Joke{ModifiedAt: object.Restore.ExpiryTime, FileName: object.Key, ContentType: object.ContentType}) + } + } + + sort.SliceStable(jokes, func(i, j int) bool { + return jokes[i].ModifiedAt.Before(jokes[i].ModifiedAt) + }) + + defer func(jokes []Joke) { + ctx, cancel := context.WithTimeout(context.Background(), time.Minute) + defer cancel() + + marshalled, err := json.Marshal(jokes) + if err != nil { + log.Printf("marshalling json: %s", err.Error()) + return + } + + err = cache.Set(ctx, "jokes:list", string(marshalled), time.Hour*6).Err() + if err != nil { + log.Printf("setting jokes:list cache: %s", err.Error()) + } + }(jokes) + + return jokes, nil +} diff --git a/api/core/joke/setter.go b/api/core/joke/setter.go deleted file mode 100644 index 335b29c..0000000 --- a/api/core/joke/setter.go +++ /dev/null @@ -1,135 +0,0 @@ -package joke - -import ( - "context" - "strconv" - "jokes-bapak2-api/core/schema" - - "github.com/Masterminds/squirrel" - "github.com/allegro/bigcache/v3" - "github.com/jackc/pgx/v4/pgxpool" - "github.com/pquerna/ffjson/ffjson" -) - -// SetAllJSONJoke fetches jokes data from GetAllJSONJokes then set it to memory cache. -func SetAllJSONJoke(db *pgxpool.Pool, ctx context.Context, memory *bigcache.BigCache) error { - jokes, err := GetAllJSONJokes(db, ctx) - if err != nil { - return err - } - err = memory.Set("jokes", jokes) - if err != nil { - return err - } - return nil -} - -func SetTotalJoke(db *pgxpool.Pool, ctx context.Context, memory *bigcache.BigCache) error { - check, err := CheckJokesCache(memory) - if err != nil { - return err - } - - if !check { - err = SetAllJSONJoke(db, ctx, memory) - if err != nil { - return err - } - } - - jokes, err := memory.Get("jokes") - if err != nil { - return err - } - - var data []schema.Joke - err = ffjson.Unmarshal(jokes, &data) - if err != nil { - return err - } - - var total = []byte(strconv.Itoa(len(data))) - err = memory.Set("total", total) - if err != nil { - return err - } - - return nil -} - -func InsertJokeIntoDB(db *pgxpool.Pool, ctx context.Context, joke schema.Joke) error { - conn, err := db.Acquire(ctx) - if err != nil { - return err - } - defer conn.Release() - - var query = squirrel.StatementBuilder.PlaceholderFormat(squirrel.Dollar) - sql, args, err := query. - Insert("jokesbapak2"). - Columns("link", "creator"). - Values(joke.Link, joke.Creator). - ToSql() - if err != nil { - return err - } - - r, err := conn.Query(ctx, sql, args...) - if err != nil { - return err - } - defer r.Close() - return nil -} - -func DeleteSingleJoke(db *pgxpool.Pool, ctx context.Context, id int) error { - conn, err := db.Acquire(ctx) - if err != nil { - return err - } - defer conn.Release() - - var query = squirrel.StatementBuilder.PlaceholderFormat(squirrel.Dollar) - sql, args, err := query. - Delete("jokesbapak2"). - Where(squirrel.Eq{"id": id}). - ToSql() - if err != nil { - return err - } - - r, err := conn.Query(ctx, sql, args...) - if err != nil { - return err - } - defer r.Close() - - return nil -} - -func UpdateJoke(db *pgxpool.Pool, ctx context.Context, newJoke schema.Joke) error { - conn, err := db.Acquire(ctx) - if err != nil { - return err - } - defer conn.Release() - - var query = squirrel.StatementBuilder.PlaceholderFormat(squirrel.Dollar) - sql, args, err := query. - Update("jokesbapak2"). - Set("link", newJoke.Link). - Set("creator", newJoke.Creator). - Where(squirrel.Eq{"id": newJoke.ID}). - ToSql() - if err != nil { - return err - } - - r, err := conn.Query(ctx, sql, args...) - if err != nil { - return err - } - defer r.Close() - - return nil -} diff --git a/api/core/joke/setter_test.go b/api/core/joke/setter_test.go deleted file mode 100644 index eb24245..0000000 --- a/api/core/joke/setter_test.go +++ /dev/null @@ -1,238 +0,0 @@ -package joke_test - -import ( - "context" - "jokes-bapak2-api/core/joke" - "jokes-bapak2-api/core/schema" - "testing" - "time" - - "github.com/jackc/pgx/v4" -) - -func TestSetAllJSONJoke(t *testing.T) { - ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(30*time.Second)) - defer cancel() - - defer Flush() - - conn, err := db.Acquire(ctx) - if err != nil { - t.Error("an error was thrown:", err) - } - defer conn.Release() - - err = conn.BeginFunc(ctx, func(t pgx.Tx) error { - _, err := t.Exec( - ctx, - `INSERT INTO "administrators" - (id, key, token, last_used) - VALUES - ($1, $2, $3, $4), - ($5, $6, $7, $8)`, - administratorsData..., - ) - if err != nil { - return err - } - _, err = t.Exec( - ctx, - `INSERT INTO "jokesbapak2" - (id, link, creator) - VALUES - ($1, $2, $3), - ($4, $5, $6), - ($7, $8, $9)`, - jokesData..., - ) - if err != nil { - return err - } - - return nil - }) - if err != nil { - t.Error("an error was thrown:", err) - } - - err = joke.SetAllJSONJoke(db, ctx, memory) - if err != nil { - t.Error("an error was thrown:", err) - } -} - -func TestSetTotalJoke(t *testing.T) { - ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(30*time.Second)) - defer cancel() - - defer Flush() - - conn, err := db.Acquire(ctx) - if err != nil { - t.Error("an error was thrown:", err) - } - defer conn.Release() - - err = conn.BeginFunc(ctx, func(t pgx.Tx) error { - _, err := t.Exec( - ctx, - `INSERT INTO "administrators" - (id, key, token, last_used) - VALUES - ($1, $2, $3, $4), - ($5, $6, $7, $8)`, - administratorsData..., - ) - if err != nil { - return err - } - _, err = t.Exec( - ctx, - `INSERT INTO "jokesbapak2" - (id, link, creator) - VALUES - ($1, $2, $3), - ($4, $5, $6), - ($7, $8, $9)`, - jokesData..., - ) - if err != nil { - return err - } - - return nil - }) - if err != nil { - t.Error("an error was thrown:", err) - } - - err = joke.SetTotalJoke(db, ctx, memory) - if err != nil { - t.Error("an error was thrown:", err) - } -} - -func TestInsertJokeIntoDB(t *testing.T) { - ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(30*time.Second)) - defer cancel() - - defer Flush() - - data := schema.Joke{ - ID: 1, - Link: "link1", - Creator: 1, - } - err := joke.InsertJokeIntoDB(db, ctx, data) - if err != nil { - t.Error("an error was thrown:", err) - } -} - -func TestDeleteSingleJoke(t *testing.T) { - ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(30*time.Second)) - defer cancel() - - defer Flush() - - conn, err := db.Acquire(ctx) - if err != nil { - t.Error("an error was thrown:", err) - } - defer conn.Release() - - err = conn.BeginFunc(ctx, func(t pgx.Tx) error { - _, err := t.Exec( - ctx, - `INSERT INTO "administrators" - (id, key, token, last_used) - VALUES - ($1, $2, $3, $4), - ($5, $6, $7, $8)`, - administratorsData..., - ) - if err != nil { - return err - } - _, err = t.Exec( - ctx, - `INSERT INTO "jokesbapak2" - (id, link, creator) - VALUES - ($1, $2, $3), - ($4, $5, $6), - ($7, $8, $9)`, - jokesData..., - ) - if err != nil { - return err - } - - return nil - }) - if err != nil { - t.Error("an error was thrown:", err) - } - - err = joke.DeleteSingleJoke(db, ctx, 1) - if err != nil { - t.Error("an error was thrown:", err) - } -} - -func TestUpdateJoke(t *testing.T) { - ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(30*time.Second)) - defer cancel() - - defer Flush() - - conn, err := db.Acquire(ctx) - if err != nil { - t.Error("an error was thrown:", err) - } - defer conn.Release() - - err = conn.BeginFunc(ctx, func(t pgx.Tx) error { - _, err := t.Exec( - ctx, - `INSERT INTO "administrators" - (id, key, token, last_used) - VALUES - ($1, $2, $3, $4), - ($5, $6, $7, $8)`, - administratorsData..., - ) - if err != nil { - return err - } - _, err = t.Exec( - ctx, - `INSERT INTO "jokesbapak2" - (id, link, creator) - VALUES - ($1, $2, $3), - ($4, $5, $6), - ($7, $8, $9)`, - jokesData..., - ) - if err != nil { - return err - } - - return nil - }) - if err != nil { - t.Error("an error was thrown:", err) - } - - newJoke := schema.Joke{ - ID: 1, - Link: "link1", - Creator: 1, - } - - err = joke.UpdateJoke(db, ctx, newJoke) - if err != nil { - t.Error("an error was thrown:", err) - } -} diff --git a/api/core/joke/today.go b/api/core/joke/today.go new file mode 100644 index 0000000..4a54368 --- /dev/null +++ b/api/core/joke/today.go @@ -0,0 +1,76 @@ +package joke + +import ( + "context" + "encoding/hex" + "errors" + "fmt" + "log" + "time" + + "github.com/allegro/bigcache/v3" + "github.com/go-redis/redis/v8" + "github.com/minio/minio-go/v7" +) + +func GetTodaysJoke(ctx context.Context, bucket *minio.Client, cache *redis.Client, memory *bigcache.BigCache) (image []byte, contentType string, err error) { + // Today's date: + today := time.Now().Format("2006-01-02") + + jokeFromMemory, err := memory.Get("today:file:" + today) + if err != nil && !errors.Is(err, bigcache.ErrEntryNotFound) { + return []byte{}, "", fmt.Errorf("acquiring joke from memory: %w", err) + } + + if err == nil { + contentTypeFromMemory, err := memory.Get("today:content-type:" + today) + if err != nil && !errors.Is(err, bigcache.ErrEntryNotFound) { + return []byte{}, "", fmt.Errorf("acquiring joke content type from memory: %w", err) + } + + return jokeFromMemory, string(contentTypeFromMemory), nil + } + + jokeFromCache, err := cache.Get(ctx, "jokes:today:"+today).Result() + if err != nil && !errors.Is(err, redis.Nil) { + return []byte{}, "", fmt.Errorf("acquiring joke from cache: %w", err) + } + + if err == nil { + // Decode hex string to bytes + imageBytes, err := hex.DecodeString(jokeFromCache) + if err != nil { + return []byte{}, "", fmt.Errorf("decoding hex string: %w", err) + } + + defer func(today string, imageBytes []byte) { + err := memory.Set("today:"+today, imageBytes) + if err != nil { + log.Printf("setting memory cache: %s", err.Error()) + } + }(today, imageBytes) + + return imageBytes, "", nil + } + + // If everything not exists, we get a new random joke + randomJoke, contentType, err := GetRandomJoke(ctx, bucket, cache, memory) + if err != nil { + return []byte{}, "", fmt.Errorf("acquiring new random joke: %w", err) + } + + defer func(today string, joke []byte) { + ctx, cancel := context.WithTimeout(context.Background(), time.Second*30) + defer cancel() + + // Encode to hex string + encodedImage := hex.EncodeToString(joke) + + err := cache.Set(ctx, "jokes:today:"+today, encodedImage, time.Hour*24).Err() + if err != nil { + log.Printf("setting today cache to redis: %s", err.Error()) + } + }(today, randomJoke) + + return randomJoke, contentType, nil +} diff --git a/api/core/joke/total.go b/api/core/joke/total.go new file mode 100644 index 0000000..0a03e3f --- /dev/null +++ b/api/core/joke/total.go @@ -0,0 +1,66 @@ +package joke + +import ( + "context" + "errors" + "fmt" + "log" + "strconv" + "time" + + "github.com/allegro/bigcache/v3" + "github.com/go-redis/redis/v8" + "github.com/minio/minio-go/v7" +) + +func GetTotalJoke(ctx context.Context, bucket *minio.Client, cache *redis.Client, memory *bigcache.BigCache) (int, error) { + totalJokesFromMemory, err := memory.Get("total") + if err != nil && !errors.Is(err, bigcache.ErrEntryNotFound) { + return 0, fmt.Errorf("acquiring total joke from memory: %w", err) + } + + if err == nil { + total, err := strconv.Atoi(string(totalJokesFromMemory)) + if err != nil { + return 0, fmt.Errorf("parsing string to int: %w", err) + } + + return total, nil + } + + totalJokesFromCache, err := cache.Get(ctx, "jokes:total").Result() + if err != nil && !errors.Is(err, redis.Nil) { + return 0, fmt.Errorf("acquiring total joke from redis: %w", err) + } + + if err == nil { + total, err := strconv.Atoi(string(totalJokesFromCache)) + if err != nil { + return 0, fmt.Errorf("parsing string to int: %w", err) + } + + return total, nil + } + + jokes, err := ListJokesFromBucket(ctx, bucket, cache) + if err != nil { + return 0, fmt.Errorf("listing jokes: %w", err) + } + + defer func(total int) { + ctx, cancel := context.WithTimeout(context.Background(), time.Second*30) + defer cancel() + + err := cache.Set(ctx, "jokes:total", strconv.Itoa(total), time.Hour*3).Err() + if err != nil { + log.Printf("setting total jokes to redis: %s", err.Error()) + } + + err = memory.Set("total", []byte(strconv.Itoa(total))) + if err != nil { + log.Printf("setting total jokes to memory: %s", err.Error()) + } + }(len(jokes)) + + return len(jokes), nil +} diff --git a/api/core/joke/uploader.go b/api/core/joke/uploader.go new file mode 100644 index 0000000..19a9584 --- /dev/null +++ b/api/core/joke/uploader.go @@ -0,0 +1,27 @@ +package joke + +import ( + "context" + "fmt" + "io" + + "github.com/minio/minio-go/v7" +) + +func Uploader(bucket *minio.Client, ctx context.Context, key string, payload io.Reader, fileSize int64, contentType string) (string, error) { + info, err := bucket.PutObject( + ctx, + JokesBapak2Bucket, // bucketName + key, // object name, + payload, // reader + fileSize, // obuject size, + minio.PutObjectOptions{ + ContentType: contentType, + }, + ) + if err != nil { + return "", fmt.Errorf("uploading object: %w", err) + } + + return info.Key, nil +} diff --git a/api/core/schema/joke.go b/api/core/schema/joke.go index 69a9914..3ad0fd7 100644 --- a/api/core/schema/joke.go +++ b/api/core/schema/joke.go @@ -1,7 +1,7 @@ package schema type Joke struct { - ID int `json:"id" form:"id" db:"id"` - Link string `json:"link" form:"link" db:"link"` - Creator int `json:"creator" form:"creator" db:"creator"` + ID int `json:"id"` + Link string `json:"link"` + Creator int `json:"creator"` } diff --git a/api/core/schema/submit.go b/api/core/schema/submit.go index 16b2466..5de8dc2 100644 --- a/api/core/schema/submit.go +++ b/api/core/schema/submit.go @@ -1,12 +1,12 @@ package schema type Submission struct { - ID int `json:"id,omitempty" db:"id"` - Link string `json:"link" form:"link" db:"link"` - Image string `json:"image,omitempty" form:"image"` - CreatedAt string `json:"created_at" db:"created_at"` - Author string `json:"author" form:"author" db:"author"` - Status int `json:"status" db:"status"` + ID int `json:"id,omitempty"` + Link string `json:"link"` + Image string `json:"image,omitempty"` + CreatedAt string `json:"created_at"` + Author string `json:"author"` + Status int `json:"status"` } type SubmissionQuery struct { diff --git a/api/core/submit/getter.go b/api/core/submit/getter.go deleted file mode 100644 index a447a62..0000000 --- a/api/core/submit/getter.go +++ /dev/null @@ -1,115 +0,0 @@ -package submit - -import ( - "context" - "jokes-bapak2-api/core/schema" - "net/url" - "strconv" - "strings" - - "github.com/aldy505/bob" - "github.com/georgysavva/scany/pgxscan" - "github.com/jackc/pgx/v4/pgxpool" -) - -func GetSubmittedItems(db *pgxpool.Pool, ctx context.Context, queries schema.SubmissionQuery) ([]schema.Submission, error) { - var err error - var limit int - var offset int - var approved bool - - if queries.Limit != "" { - limit, err = strconv.Atoi(queries.Limit) - if err != nil { - return []schema.Submission{}, err - - } - } - if queries.Page != "" { - page, err := strconv.Atoi(queries.Page) - if err != nil { - return []schema.Submission{}, err - - } - offset = (page - 1) * 20 - } - - if queries.Approved != "" { - approved, err = strconv.ParseBool(queries.Approved) - if err != nil { - return []schema.Submission{}, err - - } - } - - var status int - - if approved { - status = 1 - } else { - status = 0 - } - - sql, args, err := GetterQueryBuilder(queries, status, limit, offset) - if err != nil { - return []schema.Submission{}, err - - } - - conn, err := db.Acquire(ctx) - if err != nil { - return []schema.Submission{}, err - } - defer conn.Release() - - var submissions []schema.Submission - results, err := conn.Query(ctx, sql, args...) - if err != nil { - return []schema.Submission{}, err - } - defer results.Close() - - err = pgxscan.ScanAll(&submissions, results) - if err != nil { - return []schema.Submission{}, err - } - - return submissions, nil -} - -func GetterQueryBuilder(queries schema.SubmissionQuery, status, limit, offset int) (string, []interface{}, error) { - var sql string - var args []interface{} - var sqlQuery strings.Builder - - sqlQuery.WriteString("SELECT * FROM submission WHERE TRUE") - - if queries.Author != "" { - sqlQuery.WriteString(" AND author = ?") - escapedAuthor, err := url.QueryUnescape(queries.Author) - if err != nil { - return sql, args, err - - } - args = append(args, escapedAuthor) - } - - if queries.Approved != "" { - sqlQuery.WriteString(" AND status = ?") - args = append(args, status) - } - - if limit > 0 { - sqlQuery.WriteString(" LIMIT " + strconv.Itoa(limit)) - } else { - sqlQuery.WriteString(" LIMIT 20") - } - - if queries.Page != "" { - sqlQuery.WriteString(" OFFSET " + strconv.Itoa(offset)) - } - - sql = bob.ReplacePlaceholder(sqlQuery.String(), bob.Dollar) - - return sql, args, nil -} diff --git a/api/core/submit/getter_test.go b/api/core/submit/getter_test.go deleted file mode 100644 index 3347acf..0000000 --- a/api/core/submit/getter_test.go +++ /dev/null @@ -1,91 +0,0 @@ -package submit_test - -import ( - "context" - "jokes-bapak2-api/core/schema" - "jokes-bapak2-api/core/submit" - "testing" - "time" -) - -func TestGetSubmittedItems(t *testing.T) { - ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(30*time.Second)) - defer cancel() - - defer Flush() - - c, err := db.Acquire(ctx) - if err != nil { - t.Error("an error was thrown:", err) - } - defer c.Release() - - tx, err := c.Begin(ctx) - if err != nil { - t.Error("an error was thrown:", err) - } - defer tx.Rollback(ctx) - - _, err = tx.Exec( - ctx, - `INSERT INTO submission - (id, link, created_at, author, status) - VALUES - ($1, $2, $3, $4, $5), - ($6, $7, $8, $9, $10)`, - submissionData...) - if err != nil { - t.Error("an error was thrown:", err) - } - - err = tx.Commit(ctx) - if err != nil { - t.Error("an error was thrown:", err) - } - - items, err := submit.GetSubmittedItems(db, ctx, schema.SubmissionQuery{}) - if err != nil { - t.Error("an error was thrown:", err) - } - - if len(items) != 2 { - t.Error("expected 2 items, got", len(items)) - } -} - -func TestGetterQueryBuilder(t *testing.T) { - s, _, err := submit.GetterQueryBuilder(schema.SubmissionQuery{}, 0, 0, 0) - if err != nil { - t.Error("an error was thrown:", err) - } - - if s != "SELECT * FROM submission WHERE TRUE LIMIT 20" { - t.Error("expected query to be", "SELECT * FROM submission WHERE TRUE LIMIT 20", "got", s) - } - - s, i, err := submit.GetterQueryBuilder(schema.SubmissionQuery{ - Author: "Test ", - Approved: "true", - Page: "2", - }, 2, 15, 10) - if err != nil { - t.Error("an error was thrown:", err) - } - - if s != "SELECT * FROM submission WHERE TRUE AND author = $1 AND status = $2 LIMIT 15 OFFSET 10" { - t.Error( - "expected query to be", - "SELECT * FROM submission WHERE TRUE AND author = $1 AND status = $2 LIMIT 15 OFFSET 15", - "got:", - s, - ) - } - - if i[0].(string) != "Test " { - t.Error("expected first arg to be Test , got:", i[0].(string)) - } - - if i[1].(int) != 2 { - t.Error("expected second arg to be 1, got:", i[1].(int)) - } -} diff --git a/api/core/submit/init_test.go b/api/core/submit/init_test.go deleted file mode 100644 index 2901baa..0000000 --- a/api/core/submit/init_test.go +++ /dev/null @@ -1,128 +0,0 @@ -package submit_test - -import ( - "context" - "os" - "testing" - "time" - - "github.com/jackc/pgx/v4/pgxpool" -) - -var db *pgxpool.Pool - -var submissionData = []interface{}{ - 1, "https://via.placeholder.com/300/01f/fff.png", "2021-08-03T18:20:38Z", "Test ", 0, - 2, "https://via.placeholder.com/300/02f/fff.png", "2021-08-04T18:20:38Z", "Test ", 1, -} - -func TestMain(m *testing.M) { - defer Teardown() - Setup() - time.Sleep(3 * time.Second) - - os.Exit(m.Run()) -} - -func Setup() { - ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(1*time.Minute)) - defer cancel() - - poolConfig, err := pgxpool.ParseConfig(os.Getenv("DATABASE_URL")) - if err != nil { - panic(err) - } - - db, err = pgxpool.ConnectConfig(ctx, poolConfig) - if err != nil { - panic(err) - } - - conn, err := db.Acquire(ctx) - if err != nil { - panic(err) - } - defer conn.Release() - - tx, err := conn.Begin(ctx) - if err != nil { - panic(err) - } - defer tx.Rollback(ctx) - - _, err = tx.Exec( - ctx, - `CREATE TABLE IF NOT EXISTS submission ( - id SERIAL PRIMARY KEY, - link VARCHAR(255) UNIQUE NOT NULL, - created_at VARCHAR(255), - author VARCHAR(255) NOT NULL, - status SMALLINT DEFAULT 0 - )`, - ) - if err != nil { - panic(err) - } - - err = tx.Commit(ctx) - if err != nil { - panic(err) - } -} - -func Teardown() (err error) { - ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(30*time.Second)) - defer cancel() - - defer db.Close() - - conn, err := db.Acquire(ctx) - if err != nil { - return err - } - defer conn.Release() - - tx, err := conn.Begin(ctx) - if err != nil { - return err - } - defer tx.Rollback(ctx) - - _, err = tx.Exec(ctx, "DROP TABLE IF EXISTS submission CASCADE") - if err != nil { - return err - } - _, err = tx.Exec(ctx, "DROP TABLE IF EXISTS jokesbapak2 CASCADE") - if err != nil { - return err - } - _, err = tx.Exec(ctx, "DROP TABLE IF EXISTS administrators CASCADE") - if err != nil { - return err - } - - err = tx.Commit(ctx) - if err != nil { - return err - } - - return -} - -func Flush() error { - ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(30*time.Second)) - defer cancel() - - conn, err := db.Acquire(ctx) - if err != nil { - return err - } - defer conn.Release() - - _, err = conn.Exec(ctx, "TRUNCATE TABLE submission RESTART IDENTITY CASCADE") - if err != nil { - return err - } - - return nil -} diff --git a/api/core/submit/setter.go b/api/core/submit/setter.go deleted file mode 100644 index 74e6155..0000000 --- a/api/core/submit/setter.go +++ /dev/null @@ -1,122 +0,0 @@ -package submit - -import ( - "bytes" - "context" - "io" - "io/ioutil" - "jokes-bapak2-api/core/schema" - "jokes-bapak2-api/utils" - "mime/multipart" - "net/http" - "net/url" - "os" - "time" - - "github.com/Masterminds/squirrel" - "github.com/georgysavva/scany/pgxscan" - "github.com/gojek/heimdall/v7/httpclient" - "github.com/jackc/pgx/v4/pgxpool" - "github.com/pquerna/ffjson/ffjson" -) - -// UploadImage process the image from the user to be uploaded to the cloud storage. -// Returns the image URL. -func UploadImage(client *httpclient.Client, image io.Reader) (string, error) { - hostURL := os.Getenv("IMAGE_API_URL") - fileName, err := utils.RandomString(10) - if err != nil { - return "", err - } - - body := &bytes.Buffer{} - writer := multipart.NewWriter(body) - - fw, err := writer.CreateFormField("image") - if err != nil { - return "", err - } - - _, err = io.Copy(fw, image) - if err != nil { - return "", err - } - - err = writer.Close() - if err != nil { - return "", err - } - - headers := http.Header{ - "Content-Type": []string{writer.FormDataContentType()}, - "User-Agent": []string{"JokesBapak2 API"}, - "Accept": []string{"application/json"}, - } - - requestURL, err := url.Parse(hostURL) - if err != nil { - return "", err - } - - params := url.Values{} - params.Add("key", os.Getenv("IMAGE_API_KEY")) - params.Add("name", fileName) - - requestURL.RawQuery = params.Encode() - - res, err := client.Post(requestURL.String(), bytes.NewReader(body.Bytes()), headers) - if err != nil { - return "", err - } - - defer res.Body.Close() - - responseBody, err := ioutil.ReadAll(res.Body) - if err != nil { - return "", err - } - - var data schema.ImageAPI - err = ffjson.Unmarshal(responseBody, &data) - if err != nil { - return "", err - } - - return data.Data.URL, nil -} - -func SubmitJoke(db *pgxpool.Pool, ctx context.Context, s schema.Submission, link string) (schema.Submission, error) { - var query = squirrel.StatementBuilder.PlaceholderFormat(squirrel.Dollar) - - conn, err := db.Acquire(ctx) - if err != nil { - return schema.Submission{}, err - } - defer conn.Release() - - now := time.Now().UTC().Format(time.RFC3339) - - sql, args, err := query. - Insert("submission"). - Columns("link", "created_at", "author"). - Values(link, now, s.Author). - Suffix("RETURNING id,created_at,link,author,status"). - ToSql() - if err != nil { - return schema.Submission{}, err - } - - var submission schema.Submission - result, err := conn.Query(ctx, sql, args...) - if err != nil { - return schema.Submission{}, err - } - defer result.Close() - - err = pgxscan.ScanOne(&submission, result) - if err != nil { - return schema.Submission{}, err - } - - return submission, nil -} diff --git a/api/core/submit/setter_test.go b/api/core/submit/setter_test.go deleted file mode 100644 index 524f18c..0000000 --- a/api/core/submit/setter_test.go +++ /dev/null @@ -1,25 +0,0 @@ -package submit_test - -import ( - "context" - "jokes-bapak2-api/core/schema" - "jokes-bapak2-api/core/submit" - "testing" - "time" -) - -func TestSubmitJoke(t *testing.T) { - ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(30*time.Second)) - defer cancel() - - defer Flush() - - s, err := submit.SubmitJoke(db, ctx, schema.Submission{Author: "Test "}, "https://example.net/img.png") - if err != nil { - t.Error("an error was thrown:", err) - } - - if s.Link != "https://example.net/img.png" { - t.Error("link is not correct, got:", s.Link) - } -} diff --git a/api/core/validator/author.go b/api/core/validator/author.go deleted file mode 100644 index afc7d43..0000000 --- a/api/core/validator/author.go +++ /dev/null @@ -1,25 +0,0 @@ -package validator - -import ( - "regexp" - "strings" -) - -func ValidateAuthor(author string) bool { - if len(author) > 200 { - return false - } - - split := strings.Split(author, " ") - if strings.HasPrefix(split[0], "<") && strings.HasSuffix(split[0], ">") { - return false - } - if !strings.HasPrefix(split[len(split)-1], "<") && !strings.HasSuffix(split[len(split)-1], ">") { - return false - } - - email := strings.Replace(split[len(split)-1], "<", "", 1) - email = strings.Replace(email, ">", "", 1) - pattern := regexp.MustCompile("^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$") - return pattern.MatchString(email) -} diff --git a/api/core/validator/author_test.go b/api/core/validator/author_test.go deleted file mode 100644 index cc1408b..0000000 --- a/api/core/validator/author_test.go +++ /dev/null @@ -1,40 +0,0 @@ -package validator_test - -import ( - "jokes-bapak2-api/core/validator" - "testing" -) - -func TestValidateAuthor_False(t *testing.T) { - v := validator.ValidateAuthor("Test Author") - if v != false { - t.Error("Expected false, got true") - } - - v = validator.ValidateAuthor("Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec.") - if v != false { - t.Error("Expected false, got true") - } - - v = validator.ValidateAuthor("") - if v != false { - t.Error("Expected false, got true") - } - - v = validator.ValidateAuthor("Test ") - if v != false { - t.Error("Expected false, got true") - } -} - -func TestValidateAuthor_True(t *testing.T) { - v := validator.ValidateAuthor("Test Author ") - if v != true { - t.Error("Expected true, got false") - } -} diff --git a/api/core/validator/image.go b/api/core/validator/image.go deleted file mode 100644 index eff0a7a..0000000 --- a/api/core/validator/image.go +++ /dev/null @@ -1,30 +0,0 @@ -package validator - -import ( - "errors" - "jokes-bapak2-api/utils" - "net/http" - "strings" - - "github.com/gojek/heimdall/v7/httpclient" -) - -var ValidContentType = []string{"image/jpeg", "image/png", "image/webp", "image/gif"} - -// CheckImageValidity calls to the image host to check whether it's a valid image or not. -func CheckImageValidity(client *httpclient.Client, link string) (bool, error) { - if strings.Contains(link, "https://") { - // Perform HTTP call to link - res, err := client.Get(link, http.Header{"User-Agent": []string{"JokesBapak2 API"}}) - if err != nil { - return false, err - } - - if res.StatusCode == 200 && utils.IsIn(ValidContentType, res.Header.Get("content-type")) { - return true, nil - } - - return false, nil - } - return false, errors.New("URL must use HTTPS protocol") -} diff --git a/api/core/validator/image_test.go b/api/core/validator/image_test.go deleted file mode 100644 index 8bf4143..0000000 --- a/api/core/validator/image_test.go +++ /dev/null @@ -1,50 +0,0 @@ -package validator_test - -import ( - "jokes-bapak2-api/core/validator" - "testing" - - "github.com/gojek/heimdall/v7/httpclient" -) - -func TestCheckImageValidity_Error(t *testing.T) { - client := httpclient.NewClient() - b, err := validator.CheckImageValidity(client, "http://lorem-ipsum") - if err == nil { - t.Error("Expected error, got nil") - } - - if b { - t.Error("Expected false, got true") - } - - if err.Error() != "URL must use HTTPS protocol" { - t.Error("Expected error to be URL must use HTTPS protocol, got:", err) - } -} - -func TestCheckImageValidity_False(t *testing.T) { - client := httpclient.NewClient() - - b, err := validator.CheckImageValidity(client, "https://www.youtube.com/watch?v=yTJV6T37Reo") - if err != nil { - t.Error("Expected nil, got error") - } - - if b { - t.Error("Expected false, got true") - } -} - -func TestCheckImageValidity_True(t *testing.T) { - client := httpclient.NewClient() - - b, err := validator.CheckImageValidity(client, "https://i.ytimg.com/vi/yTJV6T37Reo/maxresdefault.jpg") - if err != nil { - t.Error("Expected nil, got error") - } - - if !b { - t.Error("Expected true, got false") - } -} diff --git a/api/core/validator/joke.go b/api/core/validator/joke.go deleted file mode 100644 index ab1dde1..0000000 --- a/api/core/validator/joke.go +++ /dev/null @@ -1,69 +0,0 @@ -package validator - -import ( - "context" - "errors" - - "github.com/Masterminds/squirrel" - "github.com/jackc/pgx/v4" - "github.com/jackc/pgx/v4/pgxpool" -) - -// Validate if link already exists -func JokeLinkExists(db *pgxpool.Pool, ctx context.Context, link string) (bool, error) { - conn, err := db.Acquire(ctx) - if err != nil { - return false, err - } - defer conn.Release() - - var query = squirrel.StatementBuilder.PlaceholderFormat(squirrel.Dollar) - - sql, args, err := query. - Select("link"). - From("jokesbapak2"). - Where(squirrel.Eq{"link": link}). - ToSql() - if err != nil { - return false, err - } - - var validateLink string - err = conn.QueryRow(ctx, sql, args...).Scan(&validateLink) - if err != nil && err != pgx.ErrNoRows { - return false, err - } - - return validateLink != "", nil -} - -// Check if the joke exists -func JokeIDExists(db *pgxpool.Pool, ctx context.Context, id int) (bool, error) { - conn, err := db.Acquire(ctx) - if err != nil { - return false, err - } - defer conn.Release() - - var query = squirrel.StatementBuilder.PlaceholderFormat(squirrel.Dollar) - sql, args, err := query. - Select("id"). - From("jokesbapak2"). - Where(squirrel.Eq{"id": id}). - ToSql() - if err != nil { - return false, err - } - - var jokeID int - err = conn.QueryRow(ctx, sql, args...).Scan(&jokeID) - if err != nil && !errors.Is(err, pgx.ErrNoRows) { - return false, err - } - - if errors.Is(err, pgx.ErrNoRows) { - return false, nil - } - - return true, nil -} diff --git a/api/core/validator/submit.go b/api/core/validator/submit.go deleted file mode 100644 index c8552c9..0000000 --- a/api/core/validator/submit.go +++ /dev/null @@ -1,38 +0,0 @@ -package validator - -import ( - "context" - - "github.com/Masterminds/squirrel" - "github.com/jackc/pgx/v4" - "github.com/jackc/pgx/v4/pgxpool" -) - -func SubmitLinkExists(db *pgxpool.Pool, ctx context.Context, query squirrel.StatementBuilderType, link string) (bool, error) { - conn, err := db.Acquire(ctx) - if err != nil { - return false, err - } - defer conn.Release() - - sql, args, err := query. - Select("link"). - From("submission"). - Where(squirrel.Eq{"link": link}). - ToSql() - if err != nil { - return false, err - } - - var validateLink string - err = conn.QueryRow(ctx, sql, args...).Scan(&validateLink) - if err != nil && err != pgx.ErrNoRows { - return false, err - } - - if err == nil && validateLink != "" { - return true, nil - } - - return false, nil -} diff --git a/api/go.mod b/api/go.mod index add354b..f2819d7 100644 --- a/api/go.mod +++ b/api/go.mod @@ -1,37 +1,30 @@ module jokes-bapak2-api -go 1.17 +go 1.19 require ( - github.com/Masterminds/squirrel v1.5.1 github.com/aldy505/bob v0.0.4 - github.com/aldy505/phc-crypto v1.1.0 github.com/allegro/bigcache/v3 v3.0.1 - github.com/georgysavva/scany v0.2.9 github.com/getsentry/sentry-go v0.11.0 github.com/go-redis/redis/v8 v8.11.4 - github.com/gofiber/fiber/v2 v2.21.0 - github.com/gojek/heimdall/v7 v7.0.2 - github.com/jackc/pgx v3.6.2+incompatible github.com/jackc/pgx/v4 v4.13.0 - github.com/joho/godotenv v1.4.0 - github.com/kr/text v0.2.0 // indirect github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7 - github.com/stretchr/testify v1.7.0 // indirect - golang.org/x/sys v0.0.0-20211108224332-cbcd623f202e // indirect - gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect + golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f // indirect gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect ) require ( - github.com/andybalholm/brotli v1.0.4 // indirect + github.com/go-chi/chi/v5 v5.0.7 + github.com/minio/minio-go/v7 v7.0.35 +) + +require ( github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect + github.com/dustin/go-humanize v1.0.0 // indirect github.com/fsnotify/fsnotify v1.5.1 // indirect - github.com/gojek/valkyrie v0.0.0-20190210220504-8f62c1e7ba45 // indirect + github.com/google/uuid v1.3.0 // indirect github.com/jackc/chunkreader/v2 v2.0.1 // indirect - github.com/jackc/fake v0.0.0-20150926172116-812a484cc733 // indirect github.com/jackc/pgconn v1.10.0 // indirect github.com/jackc/pgio v1.0.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect @@ -39,15 +32,20 @@ require ( github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect github.com/jackc/pgtype v1.8.1 // indirect github.com/jackc/puddle v1.1.4 // indirect - github.com/klauspost/compress v1.13.6 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.15.9 // indirect + github.com/klauspost/cpuid/v2 v2.1.0 // indirect github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect + github.com/minio/md5-simd v1.1.2 // indirect + github.com/minio/sha256-simd v1.0.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/stretchr/objx v0.3.0 // indirect - github.com/valyala/bytebufferpool v1.0.0 // indirect - github.com/valyala/fasthttp v1.31.0 // indirect - github.com/valyala/tcplisten v1.0.0 // indirect - golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa // indirect + github.com/rs/xid v1.4.0 // indirect + github.com/sirupsen/logrus v1.9.0 // indirect + golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa // indirect + golang.org/x/net v0.0.0-20220722155237-a158d28d115b // indirect golang.org/x/text v0.3.7 // indirect + gopkg.in/ini.v1 v1.66.6 // indirect ) diff --git a/api/go.sum b/api/go.sum index 5e1a1ce..fc9d91c 100644 --- a/api/go.sum +++ b/api/go.sum @@ -2,32 +2,20 @@ github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOv github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= -github.com/DataDog/datadog-go v3.7.1+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/Masterminds/squirrel v1.5.1 h1:kWAKlLLJFxZG7N2E0mBMNWVp5AuUX+JUrnhFN74Eg+w= -github.com/Masterminds/squirrel v1.5.1/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= -github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/aldy505/bob v0.0.4 h1:36lj6JUHxGp7yt672aKcC8gk6rXpIRO/aqclQ9aXDa8= github.com/aldy505/bob v0.0.4/go.mod h1:uckrZqhg9zmbLA4MpKueIeQfrdriNqbmMalvf0+qPG4= -github.com/aldy505/phc-crypto v1.1.0 h1:BagRKCrB7FOYy5vnuXR6xs6ml2gJD/CvSJkX/Ozo63w= -github.com/aldy505/phc-crypto v1.1.0/go.mod h1:LJugClOkOWKnpLrWhSaIDRN/5ftvZPD48S5oXsT7iTg= github.com/allegro/bigcache/v3 v3.0.1 h1:Q4Xl3chywXuJNOw7NV+MeySd3zGQDj4KCpkCg0te8mc= github.com/allegro/bigcache/v3 v3.0.1/go.mod h1:aPyh7jEvrog9zAwx5N7+JUQX5dZTSGpxF1LAR4dr35I= -github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= -github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY= -github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= -github.com/cactus/go-statsd-client/statsd v0.0.0-20200423205355-cb0885a1018c/go.mod h1:l/bIBLeOl9eX+wxJAzxS4TveKRtAqlyDpHjhkfO0MEI= github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= -github.com/cockroachdb/cockroach-go/v2 v2.0.3 h1:ZA346ACHIZctef6trOTwBAEvPVm1k0uLm/bb2Atc+S8= -github.com/cockroachdb/cockroach-go/v2 v2.0.3/go.mod h1:hAuDgiVgDVkfirP9JnhXEfcXEPRKBpYdGz+l7mvYSzw= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= @@ -36,19 +24,17 @@ github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7 github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= -github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= @@ -57,13 +43,13 @@ github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4 github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= -github.com/georgysavva/scany v0.2.9 h1:Xt6rjYpHnMClTm/g+oZTnoSxUwiln5GqMNU+QeLNHQU= -github.com/georgysavva/scany v0.2.9/go.mod h1:yeOeC1BdIdl6hOwy8uefL2WNSlseFzbhlG/frrh65SA= github.com/getsentry/sentry-go v0.11.0 h1:qro8uttJGvNAMr5CLcFI9CHR0aDzXl0Vs3Pmw/oTPg8= github.com/getsentry/sentry-go v0.11.0/go.mod h1:KBQIxiZAetw62Cj8Ri964vAEWVdgfaUCn30Q3bCvANo= github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= +github.com/go-chi/chi/v5 v5.0.7 h1:rDTPXLDHGATaeHvVlLcR4Qe0zftYethFucbjVQ1PxU8= +github.com/go-chi/chi/v5 v5.0.7/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= @@ -71,24 +57,13 @@ github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-redis/redis/v8 v8.11.4 h1:kHoYkfZP6+pe04aFTnhDH6GDROa5yJdHJVNxV3F46Tg= github.com/go-redis/redis/v8 v8.11.4/go.mod h1:2Z2wHZXdQpCDXEGzqMockDpNyYvi2l4Pxt6RJr792+w= -github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/gofiber/fiber/v2 v2.21.0 h1:tdRNrgqWqcHWBwE3o51oAleEVsil4Ro02zd2vMEuP4Q= -github.com/gofiber/fiber/v2 v2.21.0/go.mod h1:MR1usVH3JHYRyQwMe2eZXRSZHRX38fkV+A7CPB+DlDQ= -github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gojek/heimdall/v7 v7.0.2 h1:+YutGXZ8oEWbCJIwjRnkKmoTl+Oxt1Urs3hc/FR0sxU= -github.com/gojek/heimdall/v7 v7.0.2/go.mod h1:Z43HtMid7ysSjmsedPTXAki6jcdcNVnjn5pmsTyiMic= -github.com/gojek/valkyrie v0.0.0-20180215180059-6aee720afcdf/go.mod h1:QzhUKaYKJmcbTnCYCAVQrroCOY7vOOI8cSQ4NbuhYf0= -github.com/gojek/valkyrie v0.0.0-20190210220504-8f62c1e7ba45 h1:jrnJW3T+GsaQCD26fe6ERlNpgLB5HlekzBU4lOscr80= -github.com/gojek/valkyrie v0.0.0-20190210220504-8f62c1e7ba45/go.mod h1:QzhUKaYKJmcbTnCYCAVQrroCOY7vOOI8cSQ4NbuhYf0= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= @@ -99,7 +74,6 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -110,6 +84,8 @@ github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= @@ -122,21 +98,13 @@ github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/ github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= -github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= -github.com/jackc/fake v0.0.0-20150926172116-812a484cc733 h1:vr3AYkKovP8uR8AvSGGUK1IDqRa5lAAvEkZG1LKaCRc= -github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ= github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= -github.com/jackc/pgconn v1.4.0/go.mod h1:Y2O3ZDF0q4mMacyWV3AstPJpeHXWGEetiFttmq5lahk= -github.com/jackc/pgconn v1.5.0/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI= -github.com/jackc/pgconn v1.5.1-0.20200601181101-fa742c524853/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI= -github.com/jackc/pgconn v1.6.4/go.mod h1:w2pne1C2tZgP+TvjqLpOigGzNqjBgQW9dUw/4Chex78= -github.com/jackc/pgconn v1.7.0/go.mod h1:sF/lPpNEMEOp+IYhyQGdAvrG20gWf6A1tKlr0v7JMeA= github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= @@ -150,61 +118,37 @@ github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5W github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= -github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A= github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= -github.com/jackc/pgproto3/v2 v2.0.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.0.2/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.0.5/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgproto3/v2 v2.1.1 h1:7PQ/4gLoqnl87ZxL7xjO0DR5gYuviDCZxQJsUlFW1eI= github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgservicefile v0.0.0-20200307190119-3430c5407db8/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg= github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= -github.com/jackc/pgtype v1.2.0/go.mod h1:5m2OfMh1wTK7x+Fk952IDmI4nw3nPrvtQdM0ZT4WpC0= -github.com/jackc/pgtype v1.3.0/go.mod h1:b0JqxHvPmljG+HQ5IsvQ0yqeSi4nGcDTVjFoiLDb0Ik= -github.com/jackc/pgtype v1.3.1-0.20200510190516-8cd94a14c75a/go.mod h1:vaogEUkALtxZMCH411K+tKzNpwzCKU+AnPzBKZ+I+Po= -github.com/jackc/pgtype v1.3.1-0.20200606141011-f6355165a91c/go.mod h1:cvk9Bgu/VzJ9/lxTO5R5sf80p0DiucVtN7ZxvaC4GmQ= -github.com/jackc/pgtype v1.4.2/go.mod h1:JCULISAZBFGrHaOXIIFiyfzW5VY0GRitRr8NeJsrdig= github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM= github.com/jackc/pgtype v1.8.1 h1:9k0IXtdJXHJbyAWQgbWr1lU+MEhPXZz6RIXxfR5oxXs= github.com/jackc/pgtype v1.8.1/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= -github.com/jackc/pgx v3.6.2+incompatible h1:2zP5OD7kiyR3xzRYMhOcXVvkDZsImVXfj+yIyTQf3/o= -github.com/jackc/pgx v3.6.2+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I= github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= -github.com/jackc/pgx/v4 v4.5.0/go.mod h1:EpAKPLdnTorwmPUUsqrPxy5fphV18j9q3wrfRXgo+kA= -github.com/jackc/pgx/v4 v4.6.0/go.mod h1:vPh43ZzxijXUVJ+t/EmXBtFmbFVO72cuneCT9oAlxAg= -github.com/jackc/pgx/v4 v4.6.1-0.20200510190926-94ba730bb1e9/go.mod h1:t3/cdRQl6fOLDxqtlyhe9UWgfIi9R8+8v8GKV5TRA/o= -github.com/jackc/pgx/v4 v4.6.1-0.20200606145419-4e5062306904/go.mod h1:ZDaNWkt9sW1JMiNn0kdYBaLelIhw7Pg4qd+Vk6tw7Hg= -github.com/jackc/pgx/v4 v4.8.1/go.mod h1:4HOLxrl8wToZJReD04/yB20GDwf4KBYETvlHciCnwW0= github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= github.com/jackc/pgx/v4 v4.13.0 h1:JCjhT5vmhMAf/YwBHLvrBn4OGdIQBiFG6ym8Zmdx570= github.com/jackc/pgx/v4 v4.13.0/go.mod h1:9P4X524sErlaxj0XSGZk7s+LD0eOyu1ZDUrrpznYDF0= github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v1.1.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v1.1.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v1.1.2/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.4 h1:5Ey/o5IfV7dYX6Znivq+N9MdK1S18OJI5OJq6EAAADw= github.com/jackc/puddle v1.1.4/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jinzhu/gorm v1.9.12/go.mod h1:vhTjlKSJUTWNtcbQtrMBFCxy7eXTzeCAzfL5fBZT/Qs= -github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= -github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= -github.com/joho/godotenv v1.4.0 h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg= -github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= github.com/kataras/golog v0.0.10/go.mod h1:yJ8YKCmyL+nWjERB90Qwn+bdyBZsaQwU3bTVFgkFIp8= @@ -215,20 +159,19 @@ github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubc github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= -github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.15.9 h1:wKRjX6JRtDdrE9qwa4b/Cip7ACOshUI4smpCQanqjSY= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.1.0 h1:eyi1Ad2aNJMW95zcSbmGg7Cg6cq3ADwLpMAP96d8rF0= +github.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq6+3iTQz8KNCLtVX6idSoTLdUw= @@ -237,10 +180,7 @@ github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 h1:P6pPBnrTSX3DEVR4fDembhR github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.4.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8= github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= @@ -252,17 +192,24 @@ github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-sqlite3 v2.0.1+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= +github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= +github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= +github.com/minio/minio-go/v7 v7.0.35 h1:JuPPxWLdxQmNLSaS8AWZnO5HBadeI1xg6FGrEELQEVU= +github.com/minio/minio-go/v7 v7.0.35/go.mod h1:nCrRzjoSUQh8hgKKtu3Y708OLvRLtuASMg2/nvmbarw= +github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= +github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= @@ -290,9 +237,10 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7 h1:xoIK0ctDddBMnc74udxJYBqlo9Ylnsp1waqjLsnef20= github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= -github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/xid v1.4.0 h1:qd7wPTDkN6KQx2VmMBLrpHkiyQwgFXRnkOLacUiaSNY= +github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= @@ -301,13 +249,13 @@ github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdh github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= -github.com/shopspring/decimal v0.0.0-20200227202807-02e2044944cc/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/shopspring/decimal v0.0.0-20200419222939-1884f454f8ea/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= +github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= @@ -319,8 +267,6 @@ github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DM github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/objx v0.3.0 h1:NGXK3lHquSN08v5vWalVI/L8XU9hdzE/G6xsrze47As= -github.com/stretchr/objx v0.3.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -332,15 +278,10 @@ github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVM github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= -github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= -github.com/valyala/fasthttp v1.31.0 h1:lrauRLII19afgCs2fnWRJ4M5IkV0lo2FqA61uGkNBfE= -github.com/valyala/fasthttp v1.31.0/go.mod h1:2rsYD01CKFrjjsvFxx75KlEUNpWNBY9JWD3K/7o2Cus= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= -github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= -github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= @@ -364,35 +305,28 @@ go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa h1:idItI2DDfCokpg0N51B2VtiLdJ4vAuXC9fnCb2gACo4= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa h1:zuSxTR4o9y82ebqCUJYNGJbGPo6sKVl54f/TVDObg1c= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -401,8 +335,8 @@ golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210510120150-4163338589ed h1:p9UgmWI9wKpfYmgaV/IZKGdXc5qEK45tDwwwDyjS26I= -golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b h1:PxfKdU9lEEDYjdIzOtC4qFWgkU2rGHdKlKowJSMN9h0= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -417,7 +351,6 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -429,11 +362,12 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211108224332-cbcd623f202e h1:9nbuBbpiqktwdlzHKUohsD5+y2a0QvX98gIWK2ARkqc= -golang.org/x/sys v0.0.0-20211108224332-cbcd623f202e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f h1:v4INt8xihDGvnrfjMDVXGxw9wrfxYyCjk0KbXjhR55s= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -463,8 +397,6 @@ golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -475,19 +407,18 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.66.6 h1:LATuAqN/shcYAOkv3wl2L4rkaKqkcgTBQjOyYDvcPKI= +gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= diff --git a/api/handler/health/health.go b/api/handler/health/health.go index fd8d767..06eb202 100644 --- a/api/handler/health/health.go +++ b/api/handler/health/health.go @@ -1,40 +1,44 @@ package health import ( + "context" + "net/http" + "time" + "github.com/go-redis/redis/v8" - "github.com/gofiber/fiber/v2" - "github.com/jackc/pgx/v4/pgxpool" + "github.com/minio/minio-go/v7" ) type Dependencies struct { - DB *pgxpool.Pool - Redis *redis.Client + Bucket *minio.Client + Cache *redis.Client } -func (d *Dependencies) Health(c *fiber.Ctx) error { - conn, err := d.DB.Acquire(c.Context()) - if err != nil { - return err - } - defer conn.Release() +func (d *Dependencies) Health(w http.ResponseWriter, r *http.Request) { + ctx, cancel := context.WithTimeout(r.Context(), time.Second*15) + defer cancel() - // Ping REDIS database - err = d.Redis.Ping(c.Context()).Err() + var bucketOk = true + var cacheOk = true + + cancel, err := d.Bucket.HealthCheck(time.Second * 15) if err != nil { - return c. - Status(fiber.StatusServiceUnavailable). - JSON(Error{ - Error: "REDIS: " + err.Error(), - }) + bucketOk = false } - _, err = conn.Query(c.Context(), "SELECT \"id\" FROM \"jokesbapak2\" LIMIT 1") - if err != nil { - return c. - Status(fiber.StatusServiceUnavailable). - JSON(Error{ - Error: "POSTGRESQL: " + err.Error(), - }) + if cancel != nil { + cancel() } - return c.SendStatus(fiber.StatusOK) + + _, err = d.Cache.Ping(ctx).Result() + if err != nil { + cacheOk = false + } + + if !bucketOk || !cacheOk { + w.WriteHeader(http.StatusServiceUnavailable) + return + } + + w.WriteHeader(http.StatusOK) } diff --git a/api/handler/joke/dependencies.go b/api/handler/joke/dependencies.go index 75d0b4c..8b05fd7 100644 --- a/api/handler/joke/dependencies.go +++ b/api/handler/joke/dependencies.go @@ -1,17 +1,13 @@ package joke import ( - "github.com/Masterminds/squirrel" "github.com/allegro/bigcache/v3" "github.com/go-redis/redis/v8" - "github.com/gojek/heimdall/v7/httpclient" - "github.com/jackc/pgx/v4/pgxpool" + "github.com/minio/minio-go/v7" ) type Dependencies struct { - DB *pgxpool.Pool Redis *redis.Client Memory *bigcache.BigCache - HTTP *httpclient.Client - Query squirrel.StatementBuilderType + Bucket *minio.Client } diff --git a/api/handler/joke/get.go b/api/handler/joke/get.go new file mode 100644 index 0000000..e2e8b8b --- /dev/null +++ b/api/handler/joke/get.go @@ -0,0 +1,63 @@ +package joke + +import ( + core "jokes-bapak2-api/core/joke" + "net/http" + "strconv" + + "github.com/go-chi/chi/v5" +) + +func (d *Dependencies) TodayJoke(w http.ResponseWriter, r *http.Request) { + joke, contentType, err := core.GetTodaysJoke(r.Context(), d.Bucket, d.Redis, d.Memory) + if err != nil { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusInternalServerError) + w.Write([]byte(`{"error":` + strconv.Quote(err.Error()) + `}`)) + return + } + + w.Header().Set("Content-Type", contentType) + w.WriteHeader(http.StatusOK) + w.Write(joke) +} + +func (d *Dependencies) SingleJoke(w http.ResponseWriter, r *http.Request) { + joke, contentType, err := core.GetRandomJoke(r.Context(), d.Bucket, d.Redis, d.Memory) + if err != nil { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusInternalServerError) + w.Write([]byte(`{"error":` + strconv.Quote(err.Error()) + `}`)) + return + } + + w.Header().Set("Content-Type", contentType) + w.WriteHeader(http.StatusOK) + w.Write(joke) + +} + +func (d *Dependencies) JokeByID(w http.ResponseWriter, r *http.Request) { + id := chi.URLParamFromCtx(r.Context(), "id") + + // Parse id to int + parsedId, err := strconv.Atoi(id) + if err != nil { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusBadRequest) + w.Write([]byte(`{"error":` + strconv.Quote(err.Error()) + `}`)) + return + } + + joke, contentType, err := core.GetJokeById(r.Context(), d.Bucket, d.Redis, d.Memory, parsedId) + if err != nil { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusInternalServerError) + w.Write([]byte(`{"error":` + strconv.Quote(err.Error()) + `}`)) + return + } + + w.Header().Set("Content-Type", contentType) + w.WriteHeader(http.StatusOK) + w.Write(joke) +} diff --git a/api/handler/joke/joke_add.go b/api/handler/joke/joke_add.go deleted file mode 100644 index 13f8f75..0000000 --- a/api/handler/joke/joke_add.go +++ /dev/null @@ -1,69 +0,0 @@ -package joke - -import ( - core "jokes-bapak2-api/core/joke" - "jokes-bapak2-api/core/schema" - "jokes-bapak2-api/core/validator" - - "github.com/gofiber/fiber/v2" -) - -func (d *Dependencies) AddNewJoke(c *fiber.Ctx) error { - var body schema.Joke - err := c.BodyParser(&body) - if err != nil { - return err - } - - // Check link validity - valid, err := validator.CheckImageValidity(d.HTTP, body.Link) - if err != nil { - return err - } - if !valid { - return c. - Status(fiber.StatusBadRequest). - JSON(Error{ - Error: "URL provided is not a valid image", - }) - } - - validateLink, err := validator.JokeLinkExists(d.DB, c.Context(), body.Link) - if err != nil { - return err - } - - if validateLink { - return c.Status(fiber.StatusConflict).JSON(Error{ - Error: "Given link is already on the jokesbapak2 database", - }) - } - - err = core.InsertJokeIntoDB( - d.DB, - c.Context(), - schema.Joke{ - Link: body.Link, - Creator: c.Locals("userID").(int), - }, - ) - if err != nil { - return err - } - - err = core.SetAllJSONJoke(d.DB, c.Context(), d.Memory) - if err != nil { - return err - } - - err = core.SetTotalJoke(d.DB, c.Context(), d.Memory) - if err != nil { - return err - } - - return c. - Status(fiber.StatusCreated). - JSON(ResponseJoke{ - Link: body.Link, - }) -} diff --git a/api/handler/joke/joke_delete.go b/api/handler/joke/joke_delete.go deleted file mode 100644 index 689ce63..0000000 --- a/api/handler/joke/joke_delete.go +++ /dev/null @@ -1,51 +0,0 @@ -package joke - -import ( - core "jokes-bapak2-api/core/joke" - "jokes-bapak2-api/core/validator" - "strconv" - - "github.com/gofiber/fiber/v2" -) - -func (d *Dependencies) DeleteJoke(c *fiber.Ctx) error { - id, err := strconv.Atoi(c.Params("id")) - if err != nil { - return err - } - - validate, err := validator.JokeIDExists(d.DB, c.Context(), id) - if err != nil { - return err - } - - if validate { - return c. - Status(fiber.StatusNotAcceptable). - JSON(Error{ - Error: "specified joke id does not exists", - }) - } - - err = core.DeleteSingleJoke(d.DB, c.Context(), id) - if err != nil { - return err - } - - err = core.SetAllJSONJoke(d.DB, c.Context(), d.Memory) - if err != nil { - return err - } - - err = core.SetTotalJoke(d.DB, c.Context(), d.Memory) - if err != nil { - return err - } - - return c. - Status(fiber.StatusOK). - JSON(ResponseJoke{ - Message: "specified joke id has been deleted", - }) - -} diff --git a/api/handler/joke/joke_get.go b/api/handler/joke/joke_get.go deleted file mode 100644 index ea75bfb..0000000 --- a/api/handler/joke/joke_get.go +++ /dev/null @@ -1,151 +0,0 @@ -package joke - -import ( - "errors" - "io/ioutil" - core "jokes-bapak2-api/core/joke" - "jokes-bapak2-api/core/schema" - "jokes-bapak2-api/utils" - "strconv" - "time" - - "github.com/gofiber/fiber/v2" -) - -func (d *Dependencies) TodayJoke(c *fiber.Ctx) error { - // check from handler.Redis if today's joke already exists - // send the joke if exists - // get a new joke if it's not, then send it. - var joke Today - err := d.Redis.MGet(c.Context(), "today:link", "today:date", "today:image", "today:contentType").Scan(&joke) - if err != nil { - return err - } - - eq, err := utils.IsToday(joke.Date) - if err != nil { - return err - } - - if eq { - c.Set("Content-Type", joke.ContentType) - return c.Status(fiber.StatusOK).Send([]byte(joke.Image)) - } - - link, err := core.GetRandomJokeFromDB(d.DB, c.Context()) - if err != nil { - return err - } - - response, err := d.HTTP.Get(link, nil) - if err != nil { - return err - } - - data, err := ioutil.ReadAll(response.Body) - if err != nil { - return err - } - - now := time.Now().UTC().Format(time.RFC3339) - err = d.Redis.MSet(c.Context(), map[string]interface{}{ - "today:link": link, - "today:date": now, - "today:image": string(data), - "today:contentType": response.Header.Get("content-type"), - }).Err() - if err != nil { - return err - } - - c.Set("Content-Type", response.Header.Get("content-type")) - return c.Status(fiber.StatusOK).Send(data) -} - -func (d *Dependencies) SingleJoke(c *fiber.Ctx) error { - checkCache, err := core.CheckJokesCache(d.Memory) - if err != nil { - return err - } - - if !checkCache { - jokes, err := core.GetAllJSONJokes(d.DB, c.Context()) - if err != nil { - return err - } - - err = d.Memory.Set("jokes", jokes) - if err != nil { - return err - } - } - - link, err := core.GetRandomJokeFromCache(d.Memory) - if err != nil && !errors.Is(err, schema.ErrEmpty) { - return err - } - - // Get image data - response, err := d.HTTP.Get(link, nil) - if err != nil { - return err - } - - data, err := ioutil.ReadAll(response.Body) - if err != nil { - return err - } - - c.Set("Content-Type", response.Header.Get("content-type")) - return c.Status(fiber.StatusOK).Send(data) - -} - -func (d *Dependencies) JokeByID(c *fiber.Ctx) error { - checkCache, err := core.CheckJokesCache(d.Memory) - if err != nil { - return err - } - - if !checkCache { - jokes, err := core.GetAllJSONJokes(d.DB, c.Context()) - if err != nil { - return err - } - - err = d.Memory.Set("jokes", jokes) - if err != nil { - return err - } - } - - id, err := strconv.Atoi(c.Params("id")) - if err != nil { - return err - } - - link, err := core.GetCachedJokeByID(d.Memory, id) - if err != nil { - return err - } - - if link == "" { - return c. - Status(fiber.StatusNotFound). - Send([]byte("Requested ID was not found.")) - } - - // Get image data - response, err := d.HTTP.Get(link, nil) - if err != nil { - return err - } - - data, err := ioutil.ReadAll(response.Body) - if err != nil { - return err - } - - c.Set("Content-Type", response.Header.Get("content-type")) - return c.Status(fiber.StatusOK).Send(data) -} diff --git a/api/handler/joke/joke_total.go b/api/handler/joke/joke_total.go deleted file mode 100644 index 298114f..0000000 --- a/api/handler/joke/joke_total.go +++ /dev/null @@ -1,42 +0,0 @@ -package joke - -import ( - "errors" - core "jokes-bapak2-api/core/joke" - - "github.com/allegro/bigcache/v3" - "github.com/gofiber/fiber/v2" -) - -func (d *Dependencies) TotalJokes(c *fiber.Ctx) error { - checkTotal, err := core.CheckTotalJokesCache(d.Memory) - if err != nil { - return err - } - - if !checkTotal { - err = core.SetTotalJoke(d.DB, c.Context(), d.Memory) - if err != nil { - return err - } - } - - total, err := d.Memory.Get("total") - - if err != nil { - if errors.Is(err, bigcache.ErrEntryNotFound) { - return c. - Status(fiber.StatusInternalServerError). - JSON(Error{ - Error: "no data found", - }) - } - return err - } - - return c. - Status(fiber.StatusOK). - JSON(ResponseJoke{ - Message: string(total), - }) -} diff --git a/api/handler/joke/joke_update.go b/api/handler/joke/joke_update.go deleted file mode 100644 index 2562a89..0000000 --- a/api/handler/joke/joke_update.go +++ /dev/null @@ -1,86 +0,0 @@ -package joke - -import ( - core "jokes-bapak2-api/core/joke" - "jokes-bapak2-api/core/schema" - "jokes-bapak2-api/core/validator" - "strconv" - - "github.com/gofiber/fiber/v2" -) - -func (d *Dependencies) UpdateJoke(c *fiber.Ctx) error { - id := c.Params("id") - // Check if the joke exists - - jokeExists, err := core.CheckJokeExists(d.DB, c.Context(), id) - if err != nil { - return err - } - - if !jokeExists { - return c. - Status(fiber.StatusNotAcceptable). - JSON(Error{ - Error: "specified joke id does not exists", - }) - } - - body := new(schema.Joke) - err = c.BodyParser(&body) - if err != nil { - return err - } - - // Check link validity - valid, err := validator.CheckImageValidity(d.HTTP, body.Link) - if err != nil { - return err - } - - if !valid { - return c. - Status(fiber.StatusBadRequest). - JSON(Error{ - Error: "URL provided is not a valid image", - }) - } - - newID, err := strconv.Atoi(id) - if err != nil { - return err - } - - newCreator, err := strconv.Atoi(c.Locals("userID").(string)) - if err != nil { - return err - } - - updatedJoke := schema.Joke{ - Link: body.Link, - Creator: newCreator, - ID: newID, - } - - err = core.UpdateJoke(d.DB, c.Context(), updatedJoke) - if err != nil { - return err - } - - err = core.SetAllJSONJoke(d.DB, c.Context(), d.Memory) - if err != nil { - return err - } - - err = core.SetTotalJoke(d.DB, c.Context(), d.Memory) - if err != nil { - return err - } - - return c. - Status(fiber.StatusOK). - JSON(ResponseJoke{ - Message: "specified joke id has been updated", - Link: body.Link, - }) -} diff --git a/api/handler/joke/total.go b/api/handler/joke/total.go new file mode 100644 index 0000000..9016f9e --- /dev/null +++ b/api/handler/joke/total.go @@ -0,0 +1,21 @@ +package joke + +import ( + core "jokes-bapak2-api/core/joke" + "net/http" + "strconv" +) + +func (d *Dependencies) TotalJokes(w http.ResponseWriter, r *http.Request) { + total, err := core.GetTotalJoke(r.Context(), d.Bucket, d.Redis, d.Memory) + if err != nil { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusInternalServerError) + w.Write([]byte(`{"error":` + strconv.Quote(err.Error()) + `}`)) + return + } + + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + w.Write([]byte(`{"message":` + strconv.Itoa(total) + `}`)) +} diff --git a/api/handler/submit/dependencies.go b/api/handler/submit/dependencies.go deleted file mode 100644 index 5f73c1b..0000000 --- a/api/handler/submit/dependencies.go +++ /dev/null @@ -1,17 +0,0 @@ -package submit - -import ( - "github.com/Masterminds/squirrel" - "github.com/allegro/bigcache/v3" - "github.com/go-redis/redis/v8" - "github.com/gojek/heimdall/v7/httpclient" - "github.com/jackc/pgx/v4/pgxpool" -) - -type Dependencies struct { - DB *pgxpool.Pool - Redis *redis.Client - Memory *bigcache.BigCache - HTTP *httpclient.Client - Query squirrel.StatementBuilderType -} diff --git a/api/handler/submit/submit_add.go b/api/handler/submit/submit_add.go deleted file mode 100644 index 5525c1c..0000000 --- a/api/handler/submit/submit_add.go +++ /dev/null @@ -1,99 +0,0 @@ -package submit - -import ( - "jokes-bapak2-api/core/schema" - core "jokes-bapak2-api/core/submit" - "jokes-bapak2-api/core/validator" - "net/url" - "strings" - - "github.com/gofiber/fiber/v2" -) - -func (d *Dependencies) SubmitJoke(c *fiber.Ctx) error { - conn, err := d.DB.Acquire(c.Context()) - if err != nil { - return err - } - defer conn.Release() - - var body schema.Submission - err = c.BodyParser(&body) - if err != nil { - return err - } - - // Image and/or Link should not be empty - if body.Image == "" && body.Link == "" { - return c.Status(fiber.StatusBadRequest).JSON(schema.Error{ - Error: "A link or an image should be supplied in a form of multipart/form-data", - }) - } - - // Author should be supplied - if body.Author == "" { - return c.Status(fiber.StatusBadRequest).JSON(schema.Error{ - Error: "An author key consisting on the format \"yourname \" must be supplied", - }) - } else { - // Validate format - valid := validator.ValidateAuthor(body.Author) - if !valid { - return c.Status(fiber.StatusBadRequest).JSON(schema.Error{ - Error: "Please stick to the format of \"yourname \" and within 200 characters", - }) - } - } - - var link string - - // Check link validity if link was provided - if body.Link != "" { - valid, err := validator.CheckImageValidity(d.HTTP, body.Link) - if err != nil { - return err - } - if !valid { - return c.Status(fiber.StatusBadRequest).JSON(schema.Error{ - Error: "URL provided is not a valid image", - }) - } - - link = body.Link - } - - // If image was provided - if body.Image != "" { - image := strings.NewReader(body.Image) - - link, err = core.UploadImage(d.HTTP, image) - if err != nil { - return err - } - } - - // Validate if link already exists - validateLink, err := validator.SubmitLinkExists(d.DB, c.Context(), d.Query, link) - if err != nil { - return err - } - - if validateLink { - return c.Status(fiber.StatusConflict).JSON(schema.Error{ - Error: "Given link is already on the submission queue.", - }) - } - - submission, err := core.SubmitJoke(d.DB, c.Context(), body, link) - if err != nil { - return err - } - - return c. - Status(fiber.StatusCreated). - JSON(schema.ResponseSubmission{ - Message: "Joke submitted. Please wait for a few days for admin to approve your submission.", - Submission: submission, - AuthorPage: "/submit?author=" + url.QueryEscape(body.Author), - }) -} diff --git a/api/handler/submit/submit_get.go b/api/handler/submit/submit_get.go deleted file mode 100644 index ec04888..0000000 --- a/api/handler/submit/submit_get.go +++ /dev/null @@ -1,28 +0,0 @@ -package submit - -import ( - "jokes-bapak2-api/core/schema" - core "jokes-bapak2-api/core/submit" - - "github.com/gofiber/fiber/v2" -) - -func (d *Dependencies) GetSubmission(c *fiber.Ctx) error { - query := new(schema.SubmissionQuery) - err := c.QueryParser(query) - if err != nil { - return err - } - - submissions, err := core.GetSubmittedItems(d.DB, c.Context(), *query) - if err != nil { - return err - } - - return c. - Status(fiber.StatusOK). - JSON(fiber.Map{ - "count": len(submissions), - "jokes": submissions, - }) -} diff --git a/api/main.go b/api/main.go index 07c430d..c82c9ca 100644 --- a/api/main.go +++ b/api/main.go @@ -1,55 +1,72 @@ package main import ( + "errors" "log" + "net/http" "os" "os/signal" "context" "jokes-bapak2-api/core/joke" - "jokes-bapak2-api/platform/database" "jokes-bapak2-api/routes" + "github.com/go-redis/redis/v8" + "github.com/minio/minio-go/v7" + "github.com/minio/minio-go/v7/pkg/credentials" + "time" - "github.com/gofiber/fiber/v2" - _ "github.com/joho/godotenv/autoload" - - "github.com/Masterminds/squirrel" "github.com/allegro/bigcache/v3" "github.com/getsentry/sentry-go" - "github.com/go-redis/redis/v8" - "github.com/gofiber/fiber/v2/middleware/cors" - "github.com/gofiber/fiber/v2/middleware/etag" - "github.com/gofiber/fiber/v2/middleware/limiter" - "github.com/gojek/heimdall/v7/httpclient" - "github.com/jackc/pgx/v4/pgxpool" + "github.com/go-chi/chi/v5" ) func main() { - // Setup PostgreSQL - poolConfig, err := pgxpool.ParseConfig(os.Getenv("DATABASE_URL")) - if err != nil { - log.Panicln("Unable to create pool config", err) + redisUrl, ok := os.LookupEnv("REDIS_URL") + if !ok { + redisUrl = "redis://@localhost:6379" } - poolConfig.MaxConnIdleTime = time.Minute * 3 - poolConfig.MaxConnLifetime = time.Minute * 5 - poolConfig.MaxConns = 15 - poolConfig.MinConns = 4 - db, err := pgxpool.ConnectConfig(context.Background(), poolConfig) - if err != nil { - log.Panicln("Unable to create connection", err) + minioHost, ok := os.LookupEnv("MINIO_HOST") + if !ok { + minioHost = "localhost:9000" } - defer db.Close() - // Setup Redis - opt, err := redis.ParseURL(os.Getenv("REDIS_URL")) - if err != nil { - log.Fatalln(err) + minioID, ok := os.LookupEnv("MINIO_ACCESS_ID") + if !ok { + minioID = "minio" + } + + minioSecret, ok := os.LookupEnv("MINIO_SECRET_KEY") + if !ok { + minioSecret = "password" + } + + minioToken, ok := os.LookupEnv("MINIO_TOKEN") + if !ok { + minioToken = "" + } + + sentryDsn, ok := os.LookupEnv("SENTRY_DSN") + if !ok { + sentryDsn = "" + } + + port, ok := os.LookupEnv("PORT") + if !ok { + port = "5000" + } + + hostname, ok := os.LookupEnv("HOSTNAME") + if !ok { + hostname = "127.0.0.1" + } + + environment, ok := os.LookupEnv("ENVIRONMENT") + if !ok { + environment = "development" } - rdb := redis.NewClient(opt) - defer rdb.Close() // Setup In Memory memory, err := bigcache.NewBigCache(bigcache.DefaultConfig(6 * time.Hour)) @@ -58,122 +75,87 @@ func main() { } defer memory.Close() + // Setup MinIO + minioClient, err := minio.New(minioHost, &minio.Options{ + Creds: credentials.NewStaticV4(minioID, minioSecret, minioToken), + }) + if err != nil { + log.Fatalf("setting up minio client: %s", err.Error()) + return + } + + parsedRedisUrl, err := redis.ParseURL(redisUrl) + if err != nil { + log.Fatalf("parsing redis url: %s", err.Error()) + return + } + + redisClient := redis.NewClient(parsedRedisUrl) + defer func() { + err := redisClient.Close() + if err != nil { + log.Printf("closing redis client: %s", err.Error()) + } + }() + // Setup Sentry err = sentry.Init(sentry.ClientOptions{ - Dsn: os.Getenv("SENTRY_DSN"), - Environment: os.Getenv("ENV"), + Dsn: sentryDsn, + Environment: environment, AttachStacktrace: true, // Enable printing of SDK debug messages. // Useful when getting started or trying to figure something out. - Debug: true, + Debug: environment != "production", }) if err != nil { - log.Panicln(err) + log.Fatalf("setting up sentry: %s", err.Error()) + return } defer sentry.Flush(2 * time.Second) setupCtx, setupCancel := context.WithDeadline(context.Background(), time.Now().Add(time.Minute*4)) defer setupCancel() - err = database.Populate(db, setupCtx) + _, _, err = joke.GetTodaysJoke(setupCtx, minioClient, redisClient, memory) if err != nil { - sentry.CaptureException(err) - log.Panicln(err) + log.Fatalf("getting initial joke data: %s", err.Error()) + return } - err = joke.SetAllJSONJoke(db, setupCtx, memory) - if err != nil { - log.Panicln(err) - } - err = joke.SetTotalJoke(db, setupCtx, memory) - if err != nil { - log.Panicln(err) + healthRouter := routes.Health(minioClient, redisClient) + jokeRouter := routes.Joke(minioClient, redisClient, memory) + + router := chi.NewRouter() + + router.Mount("/health", healthRouter) + router.Mount("/", jokeRouter) + + server := &http.Server{ + Handler: router, + Addr: hostname + ":" + port, + ReadTimeout: time.Minute, + WriteTimeout: time.Minute, + IdleTimeout: time.Second * 30, + ReadHeaderTimeout: time.Minute, } - timeoutDefault := time.Minute * 1 - - app := fiber.New(fiber.Config{ - ReadTimeout: timeoutDefault, - WriteTimeout: timeoutDefault, - CaseSensitive: true, - DisableKeepalive: true, - ErrorHandler: errorHandler, - }) - - app.Use(limiter.New(limiter.Config{ - Max: 30, - Expiration: 1 * time.Minute, - LimitReached: limitHandler, - })) - - app.Use(cors.New()) - app.Use(etag.New()) - - route := routes.Dependencies{ - DB: db, - Redis: rdb, - Memory: memory, - HTTP: httpclient.NewClient(httpclient.WithHTTPTimeout(10 * time.Second)), - Query: squirrel.StatementBuilder.PlaceholderFormat(squirrel.Dollar), - App: app, - } - route.Health() - route.Joke() - route.Submit() - - // Start server (with or without graceful shutdown). - if os.Getenv("ENV") == "development" { - StartServer(app) - } else { - StartServerWithGracefulShutdown(app) - } -} - -func limitHandler(c *fiber.Ctx) error { - return c.Status(fiber.StatusTooManyRequests).JSON(fiber.Map{ - "message": "we only allow up to 15 request per minute", - }) -} - -func errorHandler(c *fiber.Ctx, err error) error { - log.Println(err) - sentry.CaptureException(err) - return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ - "error": "Something went wrong on our end", - }) -} - -// StartServerWithGracefulShutdown function for starting server with a graceful shutdown. -func StartServerWithGracefulShutdown(a *fiber.App) { - // Create channel for idle connections. - idleConnsClosed := make(chan struct{}) + exitSignal := make(chan os.Signal, 1) + signal.Notify(exitSignal, os.Interrupt) go func() { - sigint := make(chan os.Signal, 1) - signal.Notify(sigint, os.Interrupt) // Catch OS signals. - <-sigint - - // Received an interrupt signal, shutdown. - if err := a.Shutdown(); err != nil { - // Error from closing listeners, or context timeout: - log.Printf("Oops... Server is not shutting down! Reason: %v", err) + err := server.ListenAndServe() + if err != nil && !errors.Is(err, http.ErrServerClosed) { + log.Fatalf("listening http server: %v", err) } - - close(idleConnsClosed) }() - // Run server. - if err := a.Listen(os.Getenv("HOST") + ":" + os.Getenv("PORT")); err != nil { - log.Printf("Oops... Server is not running! Reason: %v", err) - } + <-exitSignal - <-idleConnsClosed -} + shutdownCtx, shutdownCancel := context.WithTimeout(context.Background(), time.Second*30) + defer shutdownCancel() -// StartServer func for starting a simple server. -func StartServer(a *fiber.App) { - // Run server. - if err := a.Listen(os.Getenv("HOST") + ":" + os.Getenv("PORT")); err != nil { - log.Printf("Oops... Server is not running! Reason: %v", err) + err = server.Shutdown(shutdownCtx) + if err != nil { + log.Printf("shutting down http server: %v", err) } } diff --git a/api/middleware/auth.go b/api/middleware/auth.go deleted file mode 100644 index 3ef847d..0000000 --- a/api/middleware/auth.go +++ /dev/null @@ -1,58 +0,0 @@ -package middleware - -import ( - "jokes-bapak2-api/core/administrator" - - phccrypto "github.com/aldy505/phc-crypto" - "github.com/gofiber/fiber/v2" - "github.com/jackc/pgx/v4/pgxpool" -) - -func RequireAuth(db *pgxpool.Pool) fiber.Handler { - return func(c *fiber.Ctx) error { - var auth Auth - err := c.BodyParser(&auth) - if err != nil { - return err - } - - token, err := administrator.CheckKeyExists(db, c.Context(), auth.Key) - if err != nil { - return err - } - - if token == "" { - return c. - Status(fiber.StatusForbidden). - JSON(Error{ - Error: "Invalid key", - }) - } - - crypto, err := phccrypto.Use(phccrypto.Argon2, phccrypto.Config{}) - if err != nil { - return err - } - - verify, err := crypto.Verify(token, auth.Token) - if err != nil { - return err - } - - if verify { - id, err := administrator.GetUserID(db, c.Context(), auth.Key) - if err != nil { - return err - } - - c.Locals("userID", id) - return c.Next() - } - - return c. - Status(fiber.StatusForbidden). - JSON(Error{ - Error: "Invalid key", - }) - } -} diff --git a/api/middleware/schema.go b/api/middleware/schema.go deleted file mode 100644 index 9659dce..0000000 --- a/api/middleware/schema.go +++ /dev/null @@ -1,12 +0,0 @@ -package middleware - -type Auth struct { - ID int `json:"id" form:"id" db:"id"` - Key string `json:"key" form:"key" db:"key"` - Token string `json:"token" form:"token" db:"token"` - LastUsed string `json:"last_used" form:"last_used" db:"last_used"` -} - -type Error struct { - Error string `json:"error"` -} diff --git a/api/middleware/validation.go b/api/middleware/validation.go deleted file mode 100644 index 8e12c7c..0000000 --- a/api/middleware/validation.go +++ /dev/null @@ -1,27 +0,0 @@ -package middleware - -import ( - "regexp" - - "github.com/gofiber/fiber/v2" -) - -func OnlyIntegerAsID() fiber.Handler { - return func(c *fiber.Ctx) error { - regex, err := regexp.Compile(`([0-9]+)`) - if err != nil { - return err - } - - loc := regex.FindStringIndex(c.Params("id")) - if loc[1] == len(c.Params("id")) { - return c.Next() - } - - return c. - Status(fiber.StatusBadRequest). - JSON(Error{ - Error: "only numbers are allowed as ID", - }) - } -} diff --git a/api/routes/dependencies.go b/api/routes/dependencies.go deleted file mode 100644 index 65f6bb5..0000000 --- a/api/routes/dependencies.go +++ /dev/null @@ -1,19 +0,0 @@ -package routes - -import ( - "github.com/Masterminds/squirrel" - "github.com/allegro/bigcache/v3" - "github.com/go-redis/redis/v8" - "github.com/gofiber/fiber/v2" - "github.com/gojek/heimdall/v7/httpclient" - "github.com/jackc/pgx/v4/pgxpool" -) - -type Dependencies struct { - DB *pgxpool.Pool - Redis *redis.Client - Memory *bigcache.BigCache - HTTP *httpclient.Client - Query squirrel.StatementBuilderType - App *fiber.App -} diff --git a/api/routes/health.go b/api/routes/health.go index 3b274b3..d309169 100644 --- a/api/routes/health.go +++ b/api/routes/health.go @@ -2,18 +2,21 @@ package routes import ( "jokes-bapak2-api/handler/health" - "time" - "github.com/gofiber/fiber/v2/middleware/cache" + "github.com/go-chi/chi/v5" + "github.com/go-redis/redis/v8" + "github.com/minio/minio-go/v7" ) -func (d *Dependencies) Health() { - // Health check - deps := health.Dependencies{ - DB: d.DB, - Redis: d.Redis, +func Health(bucket *minio.Client, cache *redis.Client) *chi.Mux { + dependency := &health.Dependencies{ + Bucket: bucket, + Cache: cache, } - d.App.Get("/health", cache.New(cache.Config{Expiration: 30 * time.Minute}), deps.Health) - d.App.Get("/v1/health", cache.New(cache.Config{Expiration: 30 * time.Minute}), deps.Health) + router := chi.NewRouter() + + router.Get("/", dependency.Health) + + return router } diff --git a/api/routes/joke.go b/api/routes/joke.go index 88d531f..f8b2f7d 100644 --- a/api/routes/joke.go +++ b/api/routes/joke.go @@ -2,42 +2,33 @@ package routes import ( "jokes-bapak2-api/handler/joke" - "jokes-bapak2-api/middleware" - "time" - "github.com/gofiber/fiber/v2/middleware/cache" + "github.com/allegro/bigcache/v3" + "github.com/go-chi/chi/v5" + "github.com/go-redis/redis/v8" + "github.com/minio/minio-go/v7" ) -func (d *Dependencies) Joke() { - deps := joke.Dependencies{ - DB: d.DB, - Redis: d.Redis, - Memory: d.Memory, - HTTP: d.HTTP, - Query: d.Query, +func Joke(bucket *minio.Client, cache *redis.Client, memory *bigcache.BigCache) *chi.Mux { + deps := &joke.Dependencies{ + Memory: memory, + Bucket: bucket, + Redis: cache, } + + router := chi.NewRouter() + // Single route - d.App.Get("/", deps.SingleJoke) - d.App.Get("/v1", deps.SingleJoke) + router.Get("/", deps.SingleJoke) // Today's joke - d.App.Get("/today", cache.New(cache.Config{Expiration: 6 * time.Hour}), deps.TodayJoke) - d.App.Get("/v1/today", cache.New(cache.Config{Expiration: 6 * time.Hour}), deps.TodayJoke) + router.Get("/today", deps.TodayJoke) // Joke by ID - d.App.Get("/id/:id", middleware.OnlyIntegerAsID(), deps.JokeByID) - d.App.Get("/v1/id/:id", middleware.OnlyIntegerAsID(), deps.JokeByID) + router.Get("/id/{id}", deps.JokeByID) // Count total jokes - d.App.Get("/total", cache.New(cache.Config{Expiration: 15 * time.Minute}), deps.TotalJokes) - d.App.Get("/v1/total", cache.New(cache.Config{Expiration: 15 * time.Minute}), deps.TotalJokes) + router.Get("/total", deps.TotalJokes) - // Add new joke - d.App.Put("/", middleware.RequireAuth(d.DB), deps.AddNewJoke) - - // Update a joke - d.App.Patch("/id/:id", middleware.RequireAuth(d.DB), middleware.OnlyIntegerAsID(), deps.UpdateJoke) - - // Delete a joke - d.App.Delete("/id/:id", middleware.RequireAuth(d.DB), middleware.OnlyIntegerAsID(), deps.DeleteJoke) + return router } diff --git a/api/routes/submit.go b/api/routes/submit.go deleted file mode 100644 index f880e8b..0000000 --- a/api/routes/submit.go +++ /dev/null @@ -1,33 +0,0 @@ -package routes - -import ( - "jokes-bapak2-api/handler/submit" - "time" - - "github.com/gofiber/fiber/v2" - "github.com/gofiber/fiber/v2/middleware/cache" -) - -func (d *Dependencies) Submit() { - deps := submit.Dependencies{ - DB: d.DB, - Redis: d.Redis, - Memory: d.Memory, - HTTP: d.HTTP, - Query: d.Query, - } - - // Get pending submitted joke - d.App.Get( - "/submit", - cache.New(cache.Config{ - Expiration: 5 * time.Minute, - KeyGenerator: func(c *fiber.Ctx) string { - return c.OriginalURL() - }, - }), - deps.GetSubmission) - - // Add a joke - d.App.Post("/submit", deps.SubmitJoke) -} diff --git a/api/samples/sample1.jpg b/api/samples/sample1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2547b234d6019121ebd142ff3568c3a800b5d665 GIT binary patch literal 93859 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%0AerLUQ@ZHgy&YUdT) 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
+27ZIbtL? zkHuD7)?!SekL;p`bk6u!A>6W1MaM~H<81zGd;?{Zz*2b1lP*6+AJ{&VTNF7Qa<`p7 z?=HN8DR5S}kwO~I<&d2vZNta7q|*;CQ;fuq<{joJx8uq_Fa`6AlPm>@HE;2Q_=W%D z0HZ3dCEr|`c8ea2yTO!k#U}Y#X6A-oN||WfhWx&8=%Hp3g?eKOvzlhoBeHHkB(HDe zO+KGENJ-K8g6S%++SlXFiIlKPzj|3(-u>ODOzD|dmpyc}4F7>yeD8|DZ#hDBy-c6!gkwn63-@De3s|Y^YjpBy zb9QIlgz!h~k&)4#ZfE?%%&HsA!{6G5p zNewt zVULJ>C^W{!!ML`-Vi6hipDGz3saf>ItSR;fuRg8n{9X&Sy3E;tX9oxHNwNh_qElSI zPnO0(w}UbLlyJzal9a|B`){Scj18a^5ZgS_`Th@TrspV|uasm=0lB1-m7WM^e2gDM zdGWTT9{i`zH8=i#qU|$0{1er+$F%hwZAGi-z<|0};va*@d#D|v)q=H|0ntuS3l}l; z`sp;wd!i6uDv;shxcJ-DZB(~gY=gfbjEZm9@7UP8>&@f5y1|;uzQ32cCm!CB7b2QJ zH8lm@Ip19V^(8m#J1UEQL>mptdQ7Fdq#f4 zJmkBf7fVnyBfp_C#_by)tG9PDk-@xZ0eO_^*t+S5)o?SnIVd%UtD!WG1ra9S^bXO^ zOpj*qLL|R4(2h@t6){SSsa1CTGc4n&%jlk}N1_CQ%#aT5HnL&1iG2NU^ zQx{lB`rK~W+`r7^;G;tD;sg<9MlNYW9u}R~Li11HADp>~d^CE$dEt;|#QR{LTh*EH zE0|K5sRzN;nDu^RrnOn0-;BHH`EV&;bj7TmBnQ)lJ_>}A?-+tI7t0?+s#F7@O!7|r z#BHsrfvi96!vn?9Q@C~KM0(t`thZ@a9&7N9Fo}>&SsZaTT0HM6hne!2SxXQ-i2V_h zPkx|K>j%Z3=QjV@d5jtftP!>x10=w@~73AZ0c_m=JE^p`JmMvFWIeivqTzr!mZ{E9L{n5juSn`sda-NprU$kjlQXq&`%Pw<;d=}!z_jyCKf0tzceBz*+q~J70DsI= zk)L{~KVFG(V9xlE8t5jS1I}lCM<;7FG0mpD)zC? z%YUvtPH!BS{d_#rbaW0Hl*^33ue7mQee99c5ne96ERi%>OdDGQEll=~!cZPm&svlh zyOp)jPD->VOoI&QGfk^Z9}fl?=;rqBH@Uuno>rMS>cn|KTmuGfiqeDW|-`g>HW%bX5bksq}#0%&sNfjdgK56$&k(E(ra7E0O;I z1Ek+*yQi(}&V$M-%1HqpS+ss z7CY?SAFI(&gb^S3pKfr4k5($MIKnpT;~H*LFR%rvJu%kKrd>yVX@)>Dl#YVx*lf;g z#vX}lzbOsin_#g=a&~@%5VyUVG<$FZvIo*w?X~3wR_$L9)lh{Vpz0Ah8b=iv>Mt!V z&#u7m8nTNY5H9{@U&Tuza8us=86fkvSh52=%`+~E!!=gj5|X4{j_!S&#dd4-xKniv z&~`bQI!dR(Bl~7urTELB^mNQX1LhYDU7G41!8mbqR`y7>Tp&6kovXeOt?uQ}Gx?r1)y1;1uP z_2Pej`2WaitWZ%A-ZwA6{UYsdknYr#=q5X0_jv4*0u)_ApLSsjfV?ADUd9u=*#E_~ zJ~s>5D(x#_VAHz5rltQ1v{#$#ZXX5nw(EbC%-`V`w+*``kbr`pBGvu0x_s-l*yNl4 La#|~V?f(A&LvJNt literal 0 HcmV?d00001 diff --git a/api/samples/sample3.jpg b/api/samples/sample3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..16127770022c74f5f153d4b43f9b77f75d11798e GIT binary patch literal 87229 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
    7i!c>uV3RN>Y`dTyHnLa(h>_~*w*j( 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 QIZ4yn1p-q_^*-_b57sf(WB>pF literal 0 HcmV?d00001 diff --git a/api/samples/sample4.jpg b/api/samples/sample4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8cb907e8c04e4a61fc6da4e147e65eb8db5ff565 GIT binary patch literal 43436 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 Date: Sat, 3 Sep 2022 20:13:04 +0700 Subject: [PATCH 2/9] test: proper unit tests --- api/core/joke/getter.go | 31 +++++++- api/core/joke/getter_test.go | 71 +++++++++++++++++++ api/core/joke/{jokes_test.go => joke_test.go} | 67 ++++++++++++++++- api/core/joke/list.go | 12 +++- api/core/joke/list_test.go | 22 ++++++ api/core/joke/today.go | 18 ++++- api/core/joke/today_test.go | 39 ++++++++++ api/core/joke/total_test.go | 22 ++++++ 8 files changed, 276 insertions(+), 6 deletions(-) create mode 100644 api/core/joke/getter_test.go rename api/core/joke/{jokes_test.go => joke_test.go} (52%) create mode 100644 api/core/joke/list_test.go create mode 100644 api/core/joke/today_test.go create mode 100644 api/core/joke/total_test.go diff --git a/api/core/joke/getter.go b/api/core/joke/getter.go index 3d0b3f2..e947074 100644 --- a/api/core/joke/getter.go +++ b/api/core/joke/getter.go @@ -39,11 +39,26 @@ func GetJokeById(ctx context.Context, bucket *minio.Client, cache *redis.Client, } if err == nil { - return jokeFromMemory, "", nil + contentTypeFromMemory, err := memory.Get("id:" + strconv.Itoa(id) + ":content-type") + if err != nil && !errors.Is(err, bigcache.ErrEntryNotFound) { + return []byte{}, "", fmt.Errorf("acquiring joke content type from memory: %w", err) + } + + return jokeFromMemory, string(contentTypeFromMemory), nil } jokeFromCache, err := cache.Get(ctx, "jokes:id:"+strconv.Itoa(id)).Result() - if err != nil { + if err != nil && !errors.Is(err, redis.Nil) { + return []byte{}, "", fmt.Errorf("acquiring joke from cache: %w", err) + } + + if err == nil { + // Get content type + contentTypeFromCache, err := cache.Get(ctx, "jokes:id:"+strconv.Itoa(id)+":content-type").Result() + if err != nil && !errors.Is(err, redis.Nil) { + return []byte{}, "", fmt.Errorf("acquiring content type from cache: %w", err) + } + // Decode hex string to bytes imageBytes, err := hex.DecodeString(jokeFromCache) if err != nil { @@ -55,9 +70,14 @@ func GetJokeById(ctx context.Context, bucket *minio.Client, cache *redis.Client, if err != nil { log.Printf("setting memory cache: %s", err.Error()) } + + err = memory.Set("id:"+strconv.Itoa(id)+":content-type", []byte(contentTypeFromCache)) + if err != nil { + log.Printf("setting memory cache: %s", err.Error()) + } }(id, imageBytes) - return imageBytes, "", nil + return imageBytes, contentTypeFromCache, nil } jokes, err := ListJokesFromBucket(ctx, bucket, cache) @@ -91,6 +111,11 @@ func GetJokeById(ctx context.Context, bucket *minio.Client, cache *redis.Client, if err != nil { log.Printf("setting cache: %s", err.Error()) } + + err = cache.Set(ctx, "jokes:id:"+strconv.Itoa(id)+":content-type", jokes[id].ContentType, time.Hour*1).Err() + if err != nil { + log.Printf("setting cache: %s", err.Error()) + } }(id, image) return image, jokes[id].ContentType, nil diff --git a/api/core/joke/getter_test.go b/api/core/joke/getter_test.go new file mode 100644 index 0000000..aa81d08 --- /dev/null +++ b/api/core/joke/getter_test.go @@ -0,0 +1,71 @@ +package joke_test + +import ( + "context" + "jokes-bapak2-api/core/joke" + "testing" + "time" +) + +func TestGetRandomJoke(t *testing.T) { + ctx, cancel := context.WithTimeout(context.Background(), time.Second*30) + defer cancel() + + image, contentType, err := joke.GetRandomJoke(ctx, bucket, cache, memory) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + + if contentType != "image/jpeg" { + t.Errorf("expecting contentType of 'image/jpeg', instead got %s", contentType) + } + + if len(image) == 0 { + t.Error("empty image") + } +} + +func TestGetJokeById(t *testing.T) { + ctx, cancel := context.WithTimeout(context.Background(), time.Second*30) + defer cancel() + + image, contentType, err := joke.GetJokeById(ctx, bucket, cache, memory, 0) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + + if contentType != "image/jpeg" { + t.Errorf("expecting contentType of 'image/jpeg', instead got %s", contentType) + } + + if len(image) == 0 { + t.Error("empty image") + } + + cachedImage, cachedContentType, err := joke.GetJokeById(ctx, bucket, cache, memory, 0) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + + if cachedContentType != contentType { + t.Errorf("difference in contentType: original %s vs cached %s", contentType, cachedContentType) + } + + if string(cachedImage) != string(image) { + t.Errorf("difference in image bytes") + } + + cachedImage2, cachedContentType2, err := joke.GetJokeById(ctx, bucket, cache, memory, 0) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + + if cachedContentType2 != contentType { + t.Errorf("difference in contentType: original %s vs cached %s", contentType, cachedContentType2) + } + + if string(cachedImage2) != string(image) { + t.Errorf("difference in image bytes") + } + +} diff --git a/api/core/joke/jokes_test.go b/api/core/joke/joke_test.go similarity index 52% rename from api/core/joke/jokes_test.go rename to api/core/joke/joke_test.go index 56fd0e7..5a23744 100644 --- a/api/core/joke/jokes_test.go +++ b/api/core/joke/joke_test.go @@ -2,6 +2,7 @@ package joke_test import ( "context" + "fmt" "log" "os" "testing" @@ -61,12 +62,22 @@ func TestMain(m *testing.M) { memoryInstance, err := bigcache.NewBigCache(bigcache.DefaultConfig(time.Second * 30)) if err != nil { log.Fatalf("creating bigcache client: %s", err.Error()) + return } bucket = minioClient cache = redisClient memory = memoryInstance + setupCtx, setupCancel := context.WithTimeout(context.Background(), time.Minute) + defer setupCancel() + + err = setupBucketStorage(setupCtx, minioClient) + if err != nil { + log.Fatalf("set up bucket storage: %v", err) + return + } + exitCode := m.Run() cleanupCtx, cleanupCancel := context.WithTimeout(context.Background(), time.Minute) @@ -77,7 +88,12 @@ func TestMain(m *testing.M) { log.Printf("flushing redis: %s", err.Error()) } - err = cache.Close() + err = minioClient.RemoveBucketWithOptions(cleanupCtx, "jokesbapak2", minio.RemoveBucketOptions{ForceDelete: true}) + if err != nil { + log.Printf("removing bucket: %s", err.Error()) + } + + err = memoryInstance.Close() if err != nil { log.Printf("closing cache client: %s", err.Error()) } @@ -89,3 +105,52 @@ func TestMain(m *testing.M) { os.Exit(exitCode) } + +func setupBucketStorage(ctx context.Context, minioClient *minio.Client) error { + bucketFound, err := minioClient.BucketExists(ctx, "jokesbapak2") + if err != nil { + return fmt.Errorf("checking MinIO bucket: %w", err) + } + + if !bucketFound { + err = minioClient.MakeBucket(ctx, "jokesbapak2", minio.MakeBucketOptions{}) + if err != nil { + return fmt.Errorf("creating MinIO bucket: %w", err) + } + + policy := `{ + "Version":"2012-10-17", + "Statement":[ + { + "Sid": "AddPerm", + "Effect": "Allow", + "Principal": "*", + "Action":["s3:GetObject"], + "Resource":["arn:aws:s3:::jokesbapak2/*"] + } + ] + }` + + err = minioClient.SetBucketPolicy(ctx, "jokesbapak2", policy) + if err != nil { + return fmt.Errorf("setting bucket policy: %w", err) + } + } + + sampleFiles := []string{ + "../../samples/sample1.jpg", + "../../samples/sample2.jpg", + "../../samples/sample3.jpg", + "../../samples/sample4.jpg", + "../../samples/sample5.jpg", + } + + for i, file := range sampleFiles { + _, err := minioClient.FPutObject(ctx, "jokesbapak2", fmt.Sprintf("sample%d.jpg", i), file, minio.PutObjectOptions{ContentType: "image/jpeg"}) + if err != nil { + return fmt.Errorf("putting object: %w", err) + } + } + + return nil +} diff --git a/api/core/joke/list.go b/api/core/joke/list.go index 67b5578..db50f25 100644 --- a/api/core/joke/list.go +++ b/api/core/joke/list.go @@ -37,8 +37,18 @@ func ListJokesFromBucket(ctx context.Context, bucket *minio.Client, cache *redis return []Joke{}, fmt.Errorf("enumerating objects: %w", object.Err) } + var contentType = object.ContentType + + if contentType == "" { + stat, err := bucket.StatObject(ctx, JokesBapak2Bucket, object.Key, minio.StatObjectOptions{}) + if err != nil { + return []Joke{}, fmt.Errorf("stat object: %w", err) + } + + contentType = stat.ContentType + } if !object.IsDeleteMarker { - jokes = append(jokes, Joke{ModifiedAt: object.Restore.ExpiryTime, FileName: object.Key, ContentType: object.ContentType}) + jokes = append(jokes, Joke{ModifiedAt: object.LastModified, FileName: object.Key, ContentType: contentType}) } } diff --git a/api/core/joke/list_test.go b/api/core/joke/list_test.go new file mode 100644 index 0000000..ae8a083 --- /dev/null +++ b/api/core/joke/list_test.go @@ -0,0 +1,22 @@ +package joke_test + +import ( + "context" + "jokes-bapak2-api/core/joke" + "testing" + "time" +) + +func TestListJokeFromBucket(t *testing.T) { + ctx, cancel := context.WithTimeout(context.Background(), time.Second*30) + defer cancel() + + jokes, err := joke.ListJokesFromBucket(ctx, bucket, cache) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + + if len(jokes) != 5 { + t.Errorf("expected joke to have a length of 5, instead got %d", len(jokes)) + } +} diff --git a/api/core/joke/today.go b/api/core/joke/today.go index 4a54368..9d3eb82 100644 --- a/api/core/joke/today.go +++ b/api/core/joke/today.go @@ -37,6 +37,12 @@ func GetTodaysJoke(ctx context.Context, bucket *minio.Client, cache *redis.Clien } if err == nil { + // Get content type + contentTypeFromCache, err := cache.Get(ctx, "jokes:today:"+today+":content-type").Result() + if err != nil && !errors.Is(err, redis.Nil) { + return []byte{}, "", fmt.Errorf("acquiring content type from cache: %w", err) + } + // Decode hex string to bytes imageBytes, err := hex.DecodeString(jokeFromCache) if err != nil { @@ -48,9 +54,14 @@ func GetTodaysJoke(ctx context.Context, bucket *minio.Client, cache *redis.Clien if err != nil { log.Printf("setting memory cache: %s", err.Error()) } + + err = memory.Set("today:"+today+":content-type", []byte(contentTypeFromCache)) + if err != nil { + log.Printf("setting memory cache: %s", err.Error()) + } }(today, imageBytes) - return imageBytes, "", nil + return imageBytes, contentTypeFromCache, nil } // If everything not exists, we get a new random joke @@ -70,6 +81,11 @@ func GetTodaysJoke(ctx context.Context, bucket *minio.Client, cache *redis.Clien if err != nil { log.Printf("setting today cache to redis: %s", err.Error()) } + + err = cache.Set(ctx, "jokes:today:"+today+":content-type", contentType, time.Hour*24).Err() + if err != nil { + log.Printf("setting today cache to redis: %s", err.Error()) + } }(today, randomJoke) return randomJoke, contentType, nil diff --git a/api/core/joke/today_test.go b/api/core/joke/today_test.go new file mode 100644 index 0000000..20ecafc --- /dev/null +++ b/api/core/joke/today_test.go @@ -0,0 +1,39 @@ +package joke_test + +import ( + "context" + "jokes-bapak2-api/core/joke" + "testing" + "time" +) + +func TestGetTodaysJoke(t *testing.T) { + ctx, cancel := context.WithTimeout(context.Background(), time.Second*30) + defer cancel() + + image, contentType, err := joke.GetTodaysJoke(ctx, bucket, cache, memory) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + + if contentType != "image/jpeg" { + t.Errorf("expecting contentType of 'image/jpeg', instead got %s", contentType) + } + + if len(image) == 0 { + t.Errorf("empty image") + } + + cachedImage, cachedContentType, err := joke.GetTodaysJoke(ctx, bucket, cache, memory) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + + if contentType != cachedContentType { + t.Errorf("difference on contentType: original %s vs cached %s", contentType, cachedContentType) + } + + if string(image) != string(cachedImage) { + t.Errorf("difference in image") + } +} diff --git a/api/core/joke/total_test.go b/api/core/joke/total_test.go new file mode 100644 index 0000000..cd62d30 --- /dev/null +++ b/api/core/joke/total_test.go @@ -0,0 +1,22 @@ +package joke_test + +import ( + "context" + "jokes-bapak2-api/core/joke" + "testing" + "time" +) + +func TestGetTotalJoke(t *testing.T) { + ctx, cancel := context.WithTimeout(context.Background(), time.Second*30) + defer cancel() + + total, err := joke.GetTotalJoke(ctx, bucket, cache, memory) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + + if total != 5 { + t.Errorf("expecting total to be 5 instead got %d", total) + } +} From ac77f383943c58687e0829bc09c42454f6c5e641 Mon Sep 17 00:00:00 2001 From: Reinaldy Rafli Date: Sat, 3 Sep 2022 20:37:44 +0700 Subject: [PATCH 3/9] chore: renew everything else --- .github/workflows/ci.yml | 49 ++++---- .github/workflows/pr.yml | 47 +++++--- .gitignore | 219 +++++++++++++++++++++++++++++++++++ database/postgres/Dockerfile | 2 +- docker-compose.yml | 43 ++++++- 5 files changed, 314 insertions(+), 46 deletions(-) create mode 100644 .gitignore diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 29f8e4f..cd2b5bb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,35 +2,42 @@ name: CI on: push: - branches: [ "master" ] + branches: ["master"] jobs: api-build: name: API runs-on: ubuntu-latest - container: golang:1.17-buster + container: golang:1.19-bullseye timeout-minutes: 15 services: - postgres: - image: postgres:13-alpine + bucket: + image: minio/minio:edge-cicd env: - PGDATABASE: jokesbapak2 - POSTGRES_DB: jokesbapak2 - PGUSER: postgres - POSTGRES_USER: postgres - PGPASSWORD: password - POSTGRES_PASSWORD: password - options: >- - --health-cmd pg_isready - --health-interval 10s - --health-timeout 5s - --health-retries 5 + MINIO_ROOT_USER: root + MINIO_ROOT_PASSWORD: verysecurepassword + MINIO_ACCESS_KEY: minio_access_key + MINIO_SECRET_KEY: minio_access_key ports: - - 5432:5432 + - 9000:9000 + options: >- + --health-cmd "curl -f http://bucket:9000/minio/health/live" + --health-interval 45s + --health-timeout 30s + --health-retries 10 + --health-start-period 120s + volumes: + - minio-data:/data redis: image: redis:6-alpine ports: - 6379:6379 + options: >- + --health-cmd "redis-cli -a foobared ping | grep PONG" + --health-interval 15s + --health-timeout 10s + --health-retries 10 + --health-start-period 60s defaults: run: working-directory: ./api @@ -46,11 +53,13 @@ jobs: run: go build main.go - name: Run test & coverage - run: go test -v -coverprofile=coverage.out -covermode=atomic ./... + run: go test -v -race -coverprofile=coverage.out -covermode=atomic ./... env: ENV: development PORT: 5000 - DATABASE_URL: postgres://postgres:password@postgres:5432/jokesbapak2 + MINIO_HOST: minio:9000 + MINIO_ACCESS_ID: minio + MINIO_SECRET_KEY: password REDIS_URL: redis://@redis:6379 - name: Initialize CodeQL @@ -79,7 +88,7 @@ jobs: client-build: name: Client runs-on: ubuntu-latest - container: node:14-buster + container: node:18-bullseye timeout-minutes: 15 defaults: run: @@ -119,4 +128,4 @@ jobs: with: environment: production set_commits: skip - version: ${{ github.sha }} \ No newline at end of file + version: ${{ github.sha }} diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 44203c7..dbef251 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -2,13 +2,13 @@ name: PR on: pull_request: - branches: [ "*" ] + branches: ["*"] jobs: client-build: name: Client runs-on: ubuntu-latest - container: node:14-buster + container: node:18-bullseye timeout-minutes: 15 defaults: run: @@ -45,29 +45,36 @@ jobs: api-build: name: API runs-on: ubuntu-latest - container: golang:1.17-buster + container: golang:1.19-bullseye timeout-minutes: 15 services: - postgres: - image: postgres:13-alpine + bucket: + image: minio/minio:edge-cicd env: - PGDATABASE: jokesbapak2 - POSTGRES_DB: jokesbapak2 - PGUSER: postgres - POSTGRES_USER: postgres - PGPASSWORD: password - POSTGRES_PASSWORD: password - options: >- - --health-cmd pg_isready - --health-interval 10s - --health-timeout 5s - --health-retries 5 + MINIO_ROOT_USER: root + MINIO_ROOT_PASSWORD: verysecurepassword + MINIO_ACCESS_KEY: minio_access_key + MINIO_SECRET_KEY: minio_access_key ports: - - 5432:5432 + - 9000:9000 + options: >- + --health-cmd "curl -f http://bucket:9000/minio/health/live" + --health-interval 45s + --health-timeout 30s + --health-retries 10 + --health-start-period 120s + volumes: + - minio-data:/data redis: image: redis:6-alpine ports: - 6379:6379 + options: >- + --health-cmd "redis-cli -a foobared ping | grep PONG" + --health-interval 15s + --health-timeout 10s + --health-retries 10 + --health-start-period 60s defaults: run: working-directory: ./api @@ -87,7 +94,9 @@ jobs: env: ENV: development PORT: 5000 - DATABASE_URL: postgres://postgres:password@postgres:5432/jokesbapak2 + MINIO_HOST: minio:9000 + MINIO_ACCESS_ID: minio + MINIO_SECRET_KEY: password REDIS_URL: redis://@redis:6379 - name: Initialize CodeQL @@ -100,4 +109,4 @@ jobs: - uses: codecov/codecov-action@v2 with: - flags: api \ No newline at end of file + flags: api diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..65da6d3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,219 @@ +# Created by https://www.toptal.com/developers/gitignore/api/visualstudiocode,goland,webstorm,datagrip +# Edit at https://www.toptal.com/developers/gitignore?templates=visualstudiocode,goland,webstorm,datagrip + +### GoLand ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# SonarLint plugin +.idea/sonarlint/ + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### GoLand Patch ### +# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 + +# *.iml +# modules.xml +# .idea/misc.xml +# *.ipr + +# Sonarlint plugin +# https://plugins.jetbrains.com/plugin/7973-sonarlint +.idea/**/sonarlint/ + +# SonarQube Plugin +# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin +.idea/**/sonarIssues.xml + +# Markdown Navigator plugin +# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced +.idea/**/markdown-navigator.xml +.idea/**/markdown-navigator-enh.xml +.idea/**/markdown-navigator/ + +# Cache file creation bug +# See https://youtrack.jetbrains.com/issue/JBR-2257 +.idea/$CACHE_FILE$ + +# CodeStream plugin +# https://plugins.jetbrains.com/plugin/12206-codestream +.idea/codestream.xml + +# Azure Toolkit for IntelliJ plugin +# https://plugins.jetbrains.com/plugin/8053-azure-toolkit-for-intellij +.idea/**/azureSettings.xml + +### VisualStudioCode ### +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + +### VisualStudioCode Patch ### +# Ignore all local history of files +.history +.ionide + +# Support for Project snippet scope +.vscode/*.code-snippets + +# Ignore code-workspaces +*.code-workspace + +### WebStorm ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff + +# AWS User-specific + +# Generated files + +# Sensitive or high-churn files + +# Gradle + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake + +# Mongo Explorer plugin + +# File-based project format + +# IntelliJ + +# mpeltonen/sbt-idea plugin + +# JIRA plugin + +# Cursive Clojure plugin + +# SonarLint plugin + +# Crashlytics plugin (for Android Studio and IntelliJ) + +# Editor-based Rest Client + +# Android studio 3.1+ serialized cache file + +### WebStorm Patch ### +# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 + +# *.iml +# modules.xml +# .idea/misc.xml +# *.ipr + +# Sonarlint plugin +# https://plugins.jetbrains.com/plugin/7973-sonarlint + +# SonarQube Plugin +# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin + +# Markdown Navigator plugin +# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced + +# Cache file creation bug +# See https://youtrack.jetbrains.com/issue/JBR-2257 + +# CodeStream plugin +# https://plugins.jetbrains.com/plugin/12206-codestream + +# Azure Toolkit for IntelliJ plugin +# https://plugins.jetbrains.com/plugin/8053-azure-toolkit-for-intellij + +# End of https://www.toptal.com/developers/gitignore/api/visualstudiocode,goland,webstorm,datagrip + +data \ No newline at end of file diff --git a/database/postgres/Dockerfile b/database/postgres/Dockerfile index 8ec5916..43b28c8 100644 --- a/database/postgres/Dockerfile +++ b/database/postgres/Dockerfile @@ -1,4 +1,4 @@ -FROM postgres:13.3-alpine +FROM postgres:14.5-alpine WORKDIR /var/lib/postgresql diff --git a/docker-compose.yml b/docker-compose.yml index 89e6abc..f6abde7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -27,10 +27,8 @@ services: db: build: ./database/postgres/ command: > - -c ssl=on - -c ssl_cert_file=/var/lib/postgresql/server.crt - -c ssl_key_file=/var/lib/postgresql/server.key - restart: always + -c ssl=on -c ssl_cert_file=/var/lib/postgresql/server.crt -c ssl_key_file=/var/lib/postgresql/server.key + restart: unless-stopped ports: - 5432:5432 environment: @@ -40,18 +38,51 @@ services: PGDATA: /data/postgres # I got this key from somewhere. It works when you run it locally. POSTGRES_SSL_CA_CERT: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURjekNDQWx1Z0F3SUJBZ0lVR3lDaElvR3g0 + healthcheck: + test: pg_isready -U postgres + interval: 10s + timeout: 5s + retries: 5 + start_period: 30s volumes: - ./database/postgres/data:/data/postgres cache: image: redis:6.2.4-alpine - restart: always + restart: unless-stopped ports: - 6379:6379 + healthcheck: + test: redis-cli -a foobared ping | grep PONG + interval: 10s + timeout: 5s + retries: 5 + start_period: 30s volumes: - ./database/redis/etc:/usr/local/etc/redis - ./database/redis/data:/data + bucket: + image: quay.io/minio/minio:RELEASE.2022-02-05T04-40-59Z + command: server /data --console-address ":9001" + restart: unless-stopped + ports: + - 9001:9001 + - 9000:9000 + environment: + MINIO_ROOT_USER: minio + MINIO_ROOT_PASSWORD: password + MINIO_ACCESS_KEY: minio_access_key + MINIO_SECRET_KEY: minio_secret_key + healthcheck: + test: "curl -f http://localhost:9000/minio/health/live" + interval: 30s + timeout: 10s + retries: 5 + start_period: 60s + volumes: + - ./data/minio:/data + cache-admin: image: rediscommander/redis-commander:latest restart: always @@ -73,4 +104,4 @@ services: environment: DATABASE_URL: postgres://postgres:password@db/jokesbapak2 depends_on: - - db \ No newline at end of file + - db From 701b4b1fbfa8c973a71ee1317ca36db165bec12f Mon Sep 17 00:00:00 2001 From: Reinaldy Rafli Date: Sat, 3 Sep 2022 20:52:05 +0700 Subject: [PATCH 4/9] ci: should use bullseye image --- .github/workflows/ci.yml | 2 +- .github/workflows/pr.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cd2b5bb..654e6cd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -29,7 +29,7 @@ jobs: volumes: - minio-data:/data redis: - image: redis:6-alpine + image: redis:6-bullseye ports: - 6379:6379 options: >- diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index dbef251..6280547 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -66,7 +66,7 @@ jobs: volumes: - minio-data:/data redis: - image: redis:6-alpine + image: redis:6-bullseye ports: - 6379:6379 options: >- From 7a90e112039feec75de8a4a7ace311bacd528ddd Mon Sep 17 00:00:00 2001 From: Reinaldy Rafli Date: Sat, 3 Sep 2022 20:58:59 +0700 Subject: [PATCH 5/9] ci: remove redis check --- .github/workflows/ci.yml | 6 ------ .github/workflows/pr.yml | 6 ------ 2 files changed, 12 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 654e6cd..7ed9111 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -32,12 +32,6 @@ jobs: image: redis:6-bullseye ports: - 6379:6379 - options: >- - --health-cmd "redis-cli -a foobared ping | grep PONG" - --health-interval 15s - --health-timeout 10s - --health-retries 10 - --health-start-period 60s defaults: run: working-directory: ./api diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 6280547..3ed5344 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -69,12 +69,6 @@ jobs: image: redis:6-bullseye ports: - 6379:6379 - options: >- - --health-cmd "redis-cli -a foobared ping | grep PONG" - --health-interval 15s - --health-timeout 10s - --health-retries 10 - --health-start-period 60s defaults: run: working-directory: ./api From 16293db6cb51045a1cbbbeeabd3e06237e0bba76 Mon Sep 17 00:00:00 2001 From: Reinaldy Rafli Date: Sat, 3 Sep 2022 21:09:26 +0700 Subject: [PATCH 6/9] chore: tackle issues --- .github/workflows/ci.yml | 2 +- .github/workflows/pr.yml | 2 +- api/core/joke/getter.go | 9 +++++++-- api/core/joke/getter_test.go | 6 +++--- api/core/joke/joke.go | 3 +++ api/core/joke/joke_test.go | 8 ++++---- api/core/joke/list.go | 3 +++ api/core/joke/today.go | 3 +++ api/core/joke/total.go | 1 + api/core/joke/uploader.go | 3 ++- api/handler/joke/get.go | 2 +- api/main.go | 8 ++++---- api/routes/health.go | 1 + api/routes/joke.go | 1 + 14 files changed, 35 insertions(+), 17 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7ed9111..34a40b4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -51,7 +51,7 @@ jobs: env: ENV: development PORT: 5000 - MINIO_HOST: minio:9000 + MINIO_HOST: bucket:9000 MINIO_ACCESS_ID: minio MINIO_SECRET_KEY: password REDIS_URL: redis://@redis:6379 diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 3ed5344..73c2239 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -88,7 +88,7 @@ jobs: env: ENV: development PORT: 5000 - MINIO_HOST: minio:9000 + MINIO_HOST: bucket:9000 MINIO_ACCESS_ID: minio MINIO_SECRET_KEY: password REDIS_URL: redis://@redis:6379 diff --git a/api/core/joke/getter.go b/api/core/joke/getter.go index e947074..17893f2 100644 --- a/api/core/joke/getter.go +++ b/api/core/joke/getter.go @@ -16,6 +16,7 @@ import ( "github.com/minio/minio-go/v7" ) +// GetRandomJoke will acquire a random joke from the bucket. func GetRandomJoke(ctx context.Context, bucket *minio.Client, cache *redis.Client, memory *bigcache.BigCache) (image []byte, contentType string, err error) { totalJokes, err := GetTotalJoke(ctx, bucket, cache, memory) if err != nil { @@ -24,7 +25,7 @@ func GetRandomJoke(ctx context.Context, bucket *minio.Client, cache *redis.Clien randomIndex := rand.Intn(totalJokes - 1) - joke, contentType, err := GetJokeById(ctx, bucket, cache, memory, randomIndex) + joke, contentType, err := GetJokeByID(ctx, bucket, cache, memory, randomIndex) if err != nil { return []byte{}, "", fmt.Errorf("getting joke by id: %w", err) } @@ -32,7 +33,11 @@ func GetRandomJoke(ctx context.Context, bucket *minio.Client, cache *redis.Clien return joke, contentType, nil } -func GetJokeById(ctx context.Context, bucket *minio.Client, cache *redis.Client, memory *bigcache.BigCache, id int) (image []byte, contentType string, err error) { +// GetJokeByID wil acquire a joke by its' ID. +// +// An ID is defined as the index on the joke list that is sorted +// by it's creation (or modification) time. +func GetJokeByID(ctx context.Context, bucket *minio.Client, cache *redis.Client, memory *bigcache.BigCache, id int) (image []byte, contentType string, err error) { jokeFromMemory, err := memory.Get("id:" + strconv.Itoa(id)) if err != nil && !errors.Is(err, bigcache.ErrEntryNotFound) { return []byte{}, "", fmt.Errorf("acquiring joke from memory: %w", err) diff --git a/api/core/joke/getter_test.go b/api/core/joke/getter_test.go index aa81d08..792c75d 100644 --- a/api/core/joke/getter_test.go +++ b/api/core/joke/getter_test.go @@ -29,7 +29,7 @@ func TestGetJokeById(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), time.Second*30) defer cancel() - image, contentType, err := joke.GetJokeById(ctx, bucket, cache, memory, 0) + image, contentType, err := joke.GetJokeByID(ctx, bucket, cache, memory, 0) if err != nil { t.Errorf("unexpected error: %v", err) } @@ -42,7 +42,7 @@ func TestGetJokeById(t *testing.T) { t.Error("empty image") } - cachedImage, cachedContentType, err := joke.GetJokeById(ctx, bucket, cache, memory, 0) + cachedImage, cachedContentType, err := joke.GetJokeByID(ctx, bucket, cache, memory, 0) if err != nil { t.Errorf("unexpected error: %v", err) } @@ -55,7 +55,7 @@ func TestGetJokeById(t *testing.T) { t.Errorf("difference in image bytes") } - cachedImage2, cachedContentType2, err := joke.GetJokeById(ctx, bucket, cache, memory, 0) + cachedImage2, cachedContentType2, err := joke.GetJokeByID(ctx, bucket, cache, memory, 0) if err != nil { t.Errorf("unexpected error: %v", err) } diff --git a/api/core/joke/joke.go b/api/core/joke/joke.go index 0e475cb..8932f7d 100644 --- a/api/core/joke/joke.go +++ b/api/core/joke/joke.go @@ -2,8 +2,11 @@ package joke import "time" +// JokesBapak2Bucket defines the bucket that the jokes resides in. const JokesBapak2Bucket = "jokesbapak2" +// Joke provides a simple struct that points +// to the information of the joke. type Joke struct { FileName string ContentType string diff --git a/api/core/joke/joke_test.go b/api/core/joke/joke_test.go index 5a23744..feaad14 100644 --- a/api/core/joke/joke_test.go +++ b/api/core/joke/joke_test.go @@ -19,9 +19,9 @@ var cache *redis.Client var memory *bigcache.BigCache func TestMain(m *testing.M) { - redisUrl, ok := os.LookupEnv("REDIS_URL") + redisURL, ok := os.LookupEnv("REDIS_URL") if !ok { - redisUrl = "redis://@localhost:6379" + redisURL = "redis://@localhost:6379" } minioHost, ok := os.LookupEnv("MINIO_HOST") @@ -44,13 +44,13 @@ func TestMain(m *testing.M) { minioToken = "" } - parsedRedisUrl, err := redis.ParseURL(redisUrl) + parsedRedisURL, err := redis.ParseURL(redisURL) if err != nil { log.Fatalf("parsing redis url: %s", err.Error()) return } - redisClient := redis.NewClient(parsedRedisUrl) + redisClient := redis.NewClient(parsedRedisURL) minioClient, err := minio.New(minioHost, &minio.Options{ Creds: credentials.NewStaticV4(minioID, minioSecret, minioToken), diff --git a/api/core/joke/list.go b/api/core/joke/list.go index db50f25..5bac8bf 100644 --- a/api/core/joke/list.go +++ b/api/core/joke/list.go @@ -13,6 +13,9 @@ import ( "github.com/minio/minio-go/v7" ) +// ListJokesFromBucket provides a sorted list of joke by its' last modified field. +// +// It will return an empty slice if there is nothing on the bucket. func ListJokesFromBucket(ctx context.Context, bucket *minio.Client, cache *redis.Client) ([]Joke, error) { cached, err := cache.Get(ctx, "jokes:list").Result() if err != nil && !errors.Is(err, redis.Nil) { diff --git a/api/core/joke/today.go b/api/core/joke/today.go index 9d3eb82..e3471d3 100644 --- a/api/core/joke/today.go +++ b/api/core/joke/today.go @@ -13,6 +13,9 @@ import ( "github.com/minio/minio-go/v7" ) +// GetTodaysJoke will acquire today's joke. If it's not exists yet, +// it will acquire a random joke (from the GetRandomJoke method) +// and set it as today's joke. func GetTodaysJoke(ctx context.Context, bucket *minio.Client, cache *redis.Client, memory *bigcache.BigCache) (image []byte, contentType string, err error) { // Today's date: today := time.Now().Format("2006-01-02") diff --git a/api/core/joke/total.go b/api/core/joke/total.go index 0a03e3f..4ac0b21 100644 --- a/api/core/joke/total.go +++ b/api/core/joke/total.go @@ -13,6 +13,7 @@ import ( "github.com/minio/minio-go/v7" ) +// GetTotalJoke returns the total jokes that exists on the bucket. func GetTotalJoke(ctx context.Context, bucket *minio.Client, cache *redis.Client, memory *bigcache.BigCache) (int, error) { totalJokesFromMemory, err := memory.Get("total") if err != nil && !errors.Is(err, bigcache.ErrEntryNotFound) { diff --git a/api/core/joke/uploader.go b/api/core/joke/uploader.go index 19a9584..6f73b5a 100644 --- a/api/core/joke/uploader.go +++ b/api/core/joke/uploader.go @@ -8,7 +8,8 @@ import ( "github.com/minio/minio-go/v7" ) -func Uploader(bucket *minio.Client, ctx context.Context, key string, payload io.Reader, fileSize int64, contentType string) (string, error) { +// Uploader uploads a reader stream (io.Reader) to bucket. +func Uploader(ctx context.Context, bucket *minio.Client, key string, payload io.Reader, fileSize int64, contentType string) (string, error) { info, err := bucket.PutObject( ctx, JokesBapak2Bucket, // bucketName diff --git a/api/handler/joke/get.go b/api/handler/joke/get.go index e2e8b8b..310e682 100644 --- a/api/handler/joke/get.go +++ b/api/handler/joke/get.go @@ -49,7 +49,7 @@ func (d *Dependencies) JokeByID(w http.ResponseWriter, r *http.Request) { return } - joke, contentType, err := core.GetJokeById(r.Context(), d.Bucket, d.Redis, d.Memory, parsedId) + joke, contentType, err := core.GetJokeByID(r.Context(), d.Bucket, d.Redis, d.Memory, parsedId) if err != nil { w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusInternalServerError) diff --git a/api/main.go b/api/main.go index c82c9ca..059769d 100644 --- a/api/main.go +++ b/api/main.go @@ -23,9 +23,9 @@ import ( ) func main() { - redisUrl, ok := os.LookupEnv("REDIS_URL") + redisURL, ok := os.LookupEnv("REDIS_URL") if !ok { - redisUrl = "redis://@localhost:6379" + redisURL = "redis://@localhost:6379" } minioHost, ok := os.LookupEnv("MINIO_HOST") @@ -84,13 +84,13 @@ func main() { return } - parsedRedisUrl, err := redis.ParseURL(redisUrl) + parsedRedisURL, err := redis.ParseURL(redisURL) if err != nil { log.Fatalf("parsing redis url: %s", err.Error()) return } - redisClient := redis.NewClient(parsedRedisUrl) + redisClient := redis.NewClient(parsedRedisURL) defer func() { err := redisClient.Close() if err != nil { diff --git a/api/routes/health.go b/api/routes/health.go index d309169..d6cda70 100644 --- a/api/routes/health.go +++ b/api/routes/health.go @@ -8,6 +8,7 @@ import ( "github.com/minio/minio-go/v7" ) +// Health provides route for healthcheck endpoints. func Health(bucket *minio.Client, cache *redis.Client) *chi.Mux { dependency := &health.Dependencies{ Bucket: bucket, diff --git a/api/routes/joke.go b/api/routes/joke.go index f8b2f7d..df1fa4f 100644 --- a/api/routes/joke.go +++ b/api/routes/joke.go @@ -9,6 +9,7 @@ import ( "github.com/minio/minio-go/v7" ) +// Joke provides route for jokes. func Joke(bucket *minio.Client, cache *redis.Client, memory *bigcache.BigCache) *chi.Mux { deps := &joke.Dependencies{ Memory: memory, From af4789b6f2649673a87a95de99c902970367e16b Mon Sep 17 00:00:00 2001 From: Reinaldy Rafli Date: Sat, 3 Sep 2022 21:15:08 +0700 Subject: [PATCH 7/9] ci: minio keys --- .github/workflows/ci.yml | 4 ++-- .github/workflows/pr.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 34a40b4..48d904d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -52,8 +52,8 @@ jobs: ENV: development PORT: 5000 MINIO_HOST: bucket:9000 - MINIO_ACCESS_ID: minio - MINIO_SECRET_KEY: password + MINIO_ACCESS_ID: root + MINIO_SECRET_KEY: verysecurepassword REDIS_URL: redis://@redis:6379 - name: Initialize CodeQL diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 73c2239..209a92a 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -89,8 +89,8 @@ jobs: ENV: development PORT: 5000 MINIO_HOST: bucket:9000 - MINIO_ACCESS_ID: minio - MINIO_SECRET_KEY: password + MINIO_ACCESS_ID: root + MINIO_SECRET_KEY: verysecurepassword REDIS_URL: redis://@redis:6379 - name: Initialize CodeQL From 39039983636a4140450ea693e8ff62f4fe31d184 Mon Sep 17 00:00:00 2001 From: Reinaldy Rafli Date: Sat, 3 Sep 2022 21:29:52 +0700 Subject: [PATCH 8/9] docs: comments on functions --- api/handler/health/health.go | 3 +++ api/handler/health/schema.go | 5 ----- api/handler/joke/dependencies.go | 2 ++ api/handler/joke/get.go | 3 +++ api/handler/joke/schema.go | 16 ---------------- api/handler/joke/total.go | 1 + 6 files changed, 9 insertions(+), 21 deletions(-) delete mode 100644 api/handler/health/schema.go delete mode 100644 api/handler/joke/schema.go diff --git a/api/handler/health/health.go b/api/handler/health/health.go index 06eb202..03be5b5 100644 --- a/api/handler/health/health.go +++ b/api/handler/health/health.go @@ -9,11 +9,14 @@ import ( "github.com/minio/minio-go/v7" ) +// Dependencies provides a struct for dependency injection +// on health package type Dependencies struct { Bucket *minio.Client Cache *redis.Client } +// Health provides a http handler for healthcheck func (d *Dependencies) Health(w http.ResponseWriter, r *http.Request) { ctx, cancel := context.WithTimeout(r.Context(), time.Second*15) defer cancel() diff --git a/api/handler/health/schema.go b/api/handler/health/schema.go deleted file mode 100644 index cb99e1f..0000000 --- a/api/handler/health/schema.go +++ /dev/null @@ -1,5 +0,0 @@ -package health - -type Error struct { - Error string `json:"error"` -} diff --git a/api/handler/joke/dependencies.go b/api/handler/joke/dependencies.go index 8b05fd7..ce8c737 100644 --- a/api/handler/joke/dependencies.go +++ b/api/handler/joke/dependencies.go @@ -6,6 +6,8 @@ import ( "github.com/minio/minio-go/v7" ) +// Dependencies provides a struct for dependency injection +// on joke package type Dependencies struct { Redis *redis.Client Memory *bigcache.BigCache diff --git a/api/handler/joke/get.go b/api/handler/joke/get.go index 310e682..a8ce427 100644 --- a/api/handler/joke/get.go +++ b/api/handler/joke/get.go @@ -8,6 +8,7 @@ import ( "github.com/go-chi/chi/v5" ) +// TodayJoke provides http handler for today's joke func (d *Dependencies) TodayJoke(w http.ResponseWriter, r *http.Request) { joke, contentType, err := core.GetTodaysJoke(r.Context(), d.Bucket, d.Redis, d.Memory) if err != nil { @@ -22,6 +23,7 @@ func (d *Dependencies) TodayJoke(w http.ResponseWriter, r *http.Request) { w.Write(joke) } +// SingleJoke provides http handler for acquiring random single joke func (d *Dependencies) SingleJoke(w http.ResponseWriter, r *http.Request) { joke, contentType, err := core.GetRandomJoke(r.Context(), d.Bucket, d.Redis, d.Memory) if err != nil { @@ -37,6 +39,7 @@ func (d *Dependencies) SingleJoke(w http.ResponseWriter, r *http.Request) { } +// JokeByID provides http handler for acquiring a joke by ID func (d *Dependencies) JokeByID(w http.ResponseWriter, r *http.Request) { id := chi.URLParamFromCtx(r.Context(), "id") diff --git a/api/handler/joke/schema.go b/api/handler/joke/schema.go deleted file mode 100644 index b0180c1..0000000 --- a/api/handler/joke/schema.go +++ /dev/null @@ -1,16 +0,0 @@ -package joke - -type ResponseJoke struct { - Link string `json:"link,omitempty"` - Message string `json:"message,omitempty"` -} - -type Today struct { - Date string `redis:"today:date"` - Image string `redis:"today:image"` - ContentType string `redis:"today:contentType"` -} - -type Error struct { - Error string `json:"error"` -} diff --git a/api/handler/joke/total.go b/api/handler/joke/total.go index 9016f9e..bc250f5 100644 --- a/api/handler/joke/total.go +++ b/api/handler/joke/total.go @@ -6,6 +6,7 @@ import ( "strconv" ) +// TotalJokes provides a HTTP handler for acquiring total jokes func (d *Dependencies) TotalJokes(w http.ResponseWriter, r *http.Request) { total, err := core.GetTotalJoke(r.Context(), d.Bucket, d.Redis, d.Memory) if err != nil { From a54de60cc3b2fd6b99e5d66794f53dd331d5c72d Mon Sep 17 00:00:00 2001 From: Reinaldy Rafli Date: Sat, 3 Sep 2022 21:35:20 +0700 Subject: [PATCH 9/9] chore: handle codacy issues --- api/handler/joke/get.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/handler/joke/get.go b/api/handler/joke/get.go index a8ce427..fb9edea 100644 --- a/api/handler/joke/get.go +++ b/api/handler/joke/get.go @@ -44,7 +44,7 @@ func (d *Dependencies) JokeByID(w http.ResponseWriter, r *http.Request) { id := chi.URLParamFromCtx(r.Context(), "id") // Parse id to int - parsedId, err := strconv.Atoi(id) + parsedID, err := strconv.Atoi(id) if err != nil { w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusBadRequest) @@ -52,7 +52,7 @@ func (d *Dependencies) JokeByID(w http.ResponseWriter, r *http.Request) { return } - joke, contentType, err := core.GetJokeByID(r.Context(), d.Bucket, d.Redis, d.Memory, parsedId) + joke, contentType, err := core.GetJokeByID(r.Context(), d.Bucket, d.Redis, d.Memory, parsedID) if err != nil { w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusInternalServerError)