From 0cc18b36091aba0cd302a915ec21056d26bd39d2 Mon Sep 17 00:00:00 2001 From: tom Date: Sun, 8 Mar 2020 17:08:10 -0700 Subject: [PATCH 01/13] Added GetByAliases function in db and repository --- backend/app/adapter/db/url.go | 15 +++++++++++++++ backend/app/usecase/repository/url.go | 1 + backend/app/usecase/repository/url_fake.go | 15 +++++++++++++++ 3 files changed, 31 insertions(+) diff --git a/backend/app/adapter/db/url.go b/backend/app/adapter/db/url.go index b1fa14b97..2338195f6 100644 --- a/backend/app/adapter/db/url.go +++ b/backend/app/adapter/db/url.go @@ -96,6 +96,21 @@ WHERE "%s"=$1;`, return url, nil } +// GetByAliases finds URLs for a list of aliases +func (u URLSql) GetByAliases(aliases []string) ([]entity.URL, error) { + urls := make([]entity.URL, 0) + + for _, alias := range aliases { + url, err := u.GetByAlias(alias) + + if err != nil { + return urls, err + } + urls = append(urls, url) + } + return urls, nil +} + // NewURLSql creates URLSql func NewURLSql(db *sql.DB) *URLSql { return &URLSql{ diff --git a/backend/app/usecase/repository/url.go b/backend/app/usecase/repository/url.go index 792dcd587..1d79dbfc4 100644 --- a/backend/app/usecase/repository/url.go +++ b/backend/app/usecase/repository/url.go @@ -7,4 +7,5 @@ type URL interface { IsAliasExist(alias string) (bool, error) GetByAlias(alias string) (entity.URL, error) Create(url entity.URL) error + GetByAliases(aliases []string) ([]entity.URL, error) } diff --git a/backend/app/usecase/repository/url_fake.go b/backend/app/usecase/repository/url_fake.go index ff1f6dd7c..5079bab8f 100644 --- a/backend/app/usecase/repository/url_fake.go +++ b/backend/app/usecase/repository/url_fake.go @@ -45,6 +45,21 @@ func (u URLFake) GetByAlias(alias string) (entity.URL, error) { return url, nil } +// GetByAliases finds all URL for a list of aliases +func (u URLFake) GetByAliases(aliases []string) ([]entity.URL, error) { + urls := make([]entity.URL, 0) + + for _, alias := range aliases { + url, err := u.GetByAlias(alias) + + if err != nil { + return urls, err + } + urls = append(urls, url) + } + return urls, nil +} + // NewURLFake creates in memory URL repository func NewURLFake(urls map[string]entity.URL) URLFake { return URLFake{ From c42e35ee877ecef1ce13f8534e9e28e759fb0bc6 Mon Sep 17 00:00:00 2001 From: tom Date: Sun, 8 Mar 2020 17:08:10 -0700 Subject: [PATCH 02/13] Added GetByAliases function in db and repository --- backend/app/adapter/db/url.go | 15 +++++++++++++++ backend/app/usecase/repository/url.go | 1 + backend/app/usecase/repository/url_fake.go | 15 +++++++++++++++ 3 files changed, 31 insertions(+) diff --git a/backend/app/adapter/db/url.go b/backend/app/adapter/db/url.go index b1fa14b97..2338195f6 100644 --- a/backend/app/adapter/db/url.go +++ b/backend/app/adapter/db/url.go @@ -96,6 +96,21 @@ WHERE "%s"=$1;`, return url, nil } +// GetByAliases finds URLs for a list of aliases +func (u URLSql) GetByAliases(aliases []string) ([]entity.URL, error) { + urls := make([]entity.URL, 0) + + for _, alias := range aliases { + url, err := u.GetByAlias(alias) + + if err != nil { + return urls, err + } + urls = append(urls, url) + } + return urls, nil +} + // NewURLSql creates URLSql func NewURLSql(db *sql.DB) *URLSql { return &URLSql{ diff --git a/backend/app/usecase/repository/url.go b/backend/app/usecase/repository/url.go index 792dcd587..1d79dbfc4 100644 --- a/backend/app/usecase/repository/url.go +++ b/backend/app/usecase/repository/url.go @@ -7,4 +7,5 @@ type URL interface { IsAliasExist(alias string) (bool, error) GetByAlias(alias string) (entity.URL, error) Create(url entity.URL) error + GetByAliases(aliases []string) ([]entity.URL, error) } diff --git a/backend/app/usecase/repository/url_fake.go b/backend/app/usecase/repository/url_fake.go index ff1f6dd7c..5079bab8f 100644 --- a/backend/app/usecase/repository/url_fake.go +++ b/backend/app/usecase/repository/url_fake.go @@ -45,6 +45,21 @@ func (u URLFake) GetByAlias(alias string) (entity.URL, error) { return url, nil } +// GetByAliases finds all URL for a list of aliases +func (u URLFake) GetByAliases(aliases []string) ([]entity.URL, error) { + urls := make([]entity.URL, 0) + + for _, alias := range aliases { + url, err := u.GetByAlias(alias) + + if err != nil { + return urls, err + } + urls = append(urls, url) + } + return urls, nil +} + // NewURLFake creates in memory URL repository func NewURLFake(urls map[string]entity.URL) URLFake { return URLFake{ From 38de94ed489996ae5524f13db29169c24561cddd Mon Sep 17 00:00:00 2001 From: tom Date: Sun, 8 Mar 2020 17:58:40 -0700 Subject: [PATCH 03/13] added unit test --- .../app/adapter/db/url_integration_test.go | 111 ++++++++++++++++++ 1 file changed, 111 insertions(+) diff --git a/backend/app/adapter/db/url_integration_test.go b/backend/app/adapter/db/url_integration_test.go index 80886bebe..7a5ce8934 100644 --- a/backend/app/adapter/db/url_integration_test.go +++ b/backend/app/adapter/db/url_integration_test.go @@ -242,6 +242,117 @@ func TestURLSql_Create(t *testing.T) { } } +func TestURLSql_GetByAliases(t *testing.T) { + twoYearsAgo := mustParseTime(t, "2017-05-01T08:02:16-07:00") + now := mustParseTime(t, "2019-05-01T08:02:16-07:00") + + testCases := []struct { + name string + tableRows []urlTableRow + aliases []string + hasErr bool + expectedURLs []entity.URL + }{ + { + name: "alias not found", + tableRows: []urlTableRow{}, + aliases: []string{"220uFicCJj"}, + hasErr: true, + }, + { + name: "found url", + tableRows: []urlTableRow{ + { + alias: "220uFicCJj", + longLink: "http://www.google.com", + createdAt: &twoYearsAgo, + expireAt: &now, + updatedAt: &now, + }, + { + alias: "yDOBcj5HIPbUAsw", + longLink: "http://www.facebook.com", + createdAt: &twoYearsAgo, + expireAt: &now, + updatedAt: &now, + }, + }, + aliases: []string{"220uFicCJj", "yDOBcj5HIPbUAsw"}, + hasErr: false, + expectedURLs: []entity.URL{ + entity.URL{ + Alias: "220uFicCJj", + OriginalURL: "http://www.google.com", + CreatedAt: &twoYearsAgo, + ExpireAt: &now, + UpdatedAt: &now, + }, + entity.URL{ + Alias: "yDOBcj5HIPbUAsw", + OriginalURL: "http://www.facebook.com", + CreatedAt: &twoYearsAgo, + ExpireAt: &now, + UpdatedAt: &now, + }, + }, + }, + { + name: "nil time", + tableRows: []urlTableRow{ + { + alias: "220uFicCJj", + longLink: "http://www.google.com", + createdAt: nil, + expireAt: nil, + updatedAt: nil, + }, + { + alias: "yDOBcj5HIPbUAsw", + longLink: "http://www.facebook.com", + createdAt: &twoYearsAgo, + expireAt: &now, + updatedAt: &now, + }, + }, + aliases: []string{"220uFicCJj"}, + hasErr: false, + expectedURLs: []entity.URL{ + entity.URL{ + Alias: "220uFicCJj", + OriginalURL: "http://www.google.com", + CreatedAt: nil, + ExpireAt: nil, + UpdatedAt: nil, + }, + }, + }, + } + + for _, testCase := range testCases { + t.Run(testCase.name, func(t *testing.T) { + mdtest.AccessTestDB( + dbConnector, + dbMigrationTool, + dbMigrationRoot, + dbConfig, + func(sqlDB *sql.DB) { + insertURLTableRows(t, sqlDB, testCase.tableRows) + + urlRepo := db.NewURLSql(sqlDB) + urls, err := urlRepo.GetByAliases(testCase.aliases) + + if testCase.hasErr { + mdtest.NotEqual(t, nil, err) + return + } + mdtest.Equal(t, nil, err) + mdtest.Equal(t, testCase.expectedURLs, urls) + }, + ) + }) + } +} + func insertURLTableRows(t *testing.T, sqlDB *sql.DB, tableRows []urlTableRow) { for _, tableRow := range tableRows { _, err := sqlDB.Exec( From 3bb21a3c331d2753be027ba15d2f90bb4e3178e5 Mon Sep 17 00:00:00 2001 From: tom Date: Mon, 9 Mar 2020 22:38:51 -0700 Subject: [PATCH 04/13] rewrote GetByAliases logic --- backend/app/adapter/db/url.go | 38 ++++++++++++++++++++-- backend/app/usecase/repository/url_fake.go | 2 +- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/backend/app/adapter/db/url.go b/backend/app/adapter/db/url.go index 2338195f6..5efcd5ccf 100644 --- a/backend/app/adapter/db/url.go +++ b/backend/app/adapter/db/url.go @@ -98,16 +98,48 @@ WHERE "%s"=$1;`, // GetByAliases finds URLs for a list of aliases func (u URLSql) GetByAliases(aliases []string) ([]entity.URL, error) { - urls := make([]entity.URL, 0) + var urls []entity.URL - for _, alias := range aliases { - url, err := u.GetByAlias(alias) + statement := fmt.Sprintf(` +SELECT "%s","%s","%s","%s","%s" +FROM "%s" +WHERE "%s" IN ("%v");`, + table.URL.ColumnAlias, + table.URL.ColumnOriginalURL, + table.URL.ColumnExpireAt, + table.URL.ColumnCreatedAt, + table.URL.ColumnUpdatedAt, + table.URL.TableName, + table.URL.ColumnAlias, + aliases, + ) + + rows, err := u.db.Query(statement) + defer rows.Close() + if err != nil { + return urls, nil + } + for rows.Next() { + url := entity.URL{} + err := rows.Scan( + &url.Alias, + &url.OriginalURL, + &url.ExpireAt, + &url.CreatedAt, + &url.UpdatedAt, + ) if err != nil { return urls, err } + + url.CreatedAt = utc(url.CreatedAt) + url.UpdatedAt = utc(url.UpdatedAt) + url.ExpireAt = utc(url.ExpireAt) + urls = append(urls, url) } + return urls, nil } diff --git a/backend/app/usecase/repository/url_fake.go b/backend/app/usecase/repository/url_fake.go index 5079bab8f..dcd4f7e67 100644 --- a/backend/app/usecase/repository/url_fake.go +++ b/backend/app/usecase/repository/url_fake.go @@ -47,7 +47,7 @@ func (u URLFake) GetByAlias(alias string) (entity.URL, error) { // GetByAliases finds all URL for a list of aliases func (u URLFake) GetByAliases(aliases []string) ([]entity.URL, error) { - urls := make([]entity.URL, 0) + var urls []entity.URL for _, alias := range aliases { url, err := u.GetByAlias(alias) From fcb8bd0bcd5d9f60f157ba429a7e966e4e99cdfd Mon Sep 17 00:00:00 2001 From: tom Date: Tue, 10 Mar 2020 21:04:18 -0700 Subject: [PATCH 05/13] addressed comment --- backend/.env.dist | 24 ------------------ backend/app/adapter/db/.env | 6 ++--- backend/app/adapter/db/url.go | 25 +++++++++++++++---- .../app/adapter/db/url_integration_test.go | 2 +- 4 files changed, 24 insertions(+), 33 deletions(-) delete mode 100644 backend/.env.dist diff --git a/backend/.env.dist b/backend/.env.dist deleted file mode 100644 index b00479839..000000000 --- a/backend/.env.dist +++ /dev/null @@ -1,24 +0,0 @@ -DB_HOST=localhost -DB_PORT=5432 -DB_USER=postgres -DB_PASSWORD=password -DB_NAME=short - -RECAPTCHA_SECRET=your_recaptcha_secret - -GITHUB_CLIENT_ID=your_github_id -GITHUB_CLIENT_SECRET=your_client_secret - -FACEBOOK_CLIENT_ID=facebook_client_id -FACEBOOK_CLIENT_SECRET=facebook_client_secret -FACEBOOK_REDIRECT_URI=http://localhost/oauth/facebook/sign-in/callback - -GOOGLE_CLIENT_ID=google_client_id -GOOGLE_CLIENT_SECRET=google_client_secret -GOOGLE_REDIRECT_URI=http://localhost/oauth/google/sign-in/callback - -JWT_SECRET=random -WEB_FRONTEND_URL=http://localhost:3000 -KEY_GEN_BUFFER_SIZE=10 -KEY_GEN_HOSTNAME=kgs1-staging.short-d.com -KEY_GEN_PORT=443 \ No newline at end of file diff --git a/backend/app/adapter/db/.env b/backend/app/adapter/db/.env index 5a64fcd82..5fcb53ebd 100644 --- a/backend/app/adapter/db/.env +++ b/backend/app/adapter/db/.env @@ -1,7 +1,7 @@ DB_HOST=localhost -DB_PORT=5432 +DB_PORT=5433 DB_USER=postgres -DB_PASSWORD=password -DB_NAME=short-test +DB_PASSWORD=123456 +DB_NAME=tom MIGRATION_ROOT=./migration \ No newline at end of file diff --git a/backend/app/adapter/db/url.go b/backend/app/adapter/db/url.go index 5efcd5ccf..390f0f9cc 100644 --- a/backend/app/adapter/db/url.go +++ b/backend/app/adapter/db/url.go @@ -3,6 +3,7 @@ package db import ( "database/sql" "fmt" + "strings" "github.com/short-d/short/app/adapter/db/table" "github.com/short-d/short/app/entity" @@ -98,12 +99,26 @@ WHERE "%s"=$1;`, // GetByAliases finds URLs for a list of aliases func (u URLSql) GetByAliases(aliases []string) ([]entity.URL, error) { + // create a string for aliases parameters + // it looks like: $1, $2, $3, ...... + params := make([]string, 0, len(aliases)) + for i := range aliases { + params = append(params, fmt.Sprintf("$%d", i+1)) + } + parameterStr := strings.Join(params, ", ") + + // create a list of interface{} to hold aliases for db.Query() + aliasesInterface := []interface{}{} + for _, alias := range aliases { + aliasesInterface = append(aliasesInterface, alias) + } + var urls []entity.URL statement := fmt.Sprintf(` SELECT "%s","%s","%s","%s","%s" -FROM "%s" -WHERE "%s" IN ("%v");`, +FROM "%s" +WHERE "%s" IN (%s);`, table.URL.ColumnAlias, table.URL.ColumnOriginalURL, table.URL.ColumnExpireAt, @@ -111,15 +126,15 @@ WHERE "%s" IN ("%v");`, table.URL.ColumnUpdatedAt, table.URL.TableName, table.URL.ColumnAlias, - aliases, + parameterStr, ) - rows, err := u.db.Query(statement) - defer rows.Close() + rows, err := u.db.Query(statement, aliasesInterface...) if err != nil { return urls, nil } + defer rows.Close() for rows.Next() { url := entity.URL{} err := rows.Scan( diff --git a/backend/app/adapter/db/url_integration_test.go b/backend/app/adapter/db/url_integration_test.go index 7a5ce8934..70480ef49 100644 --- a/backend/app/adapter/db/url_integration_test.go +++ b/backend/app/adapter/db/url_integration_test.go @@ -257,7 +257,7 @@ func TestURLSql_GetByAliases(t *testing.T) { name: "alias not found", tableRows: []urlTableRow{}, aliases: []string{"220uFicCJj"}, - hasErr: true, + hasErr: false, }, { name: "found url", From 2405877f5a50434c087dad0805746ac7262ff443 Mon Sep 17 00:00:00 2001 From: tom Date: Tue, 10 Mar 2020 21:05:52 -0700 Subject: [PATCH 06/13] addressed comment --- .../app/adapter/db/url_integration_test.go | 30 ------------------- 1 file changed, 30 deletions(-) diff --git a/backend/app/adapter/db/url_integration_test.go b/backend/app/adapter/db/url_integration_test.go index 70480ef49..e68a565b8 100644 --- a/backend/app/adapter/db/url_integration_test.go +++ b/backend/app/adapter/db/url_integration_test.go @@ -296,36 +296,6 @@ func TestURLSql_GetByAliases(t *testing.T) { }, }, }, - { - name: "nil time", - tableRows: []urlTableRow{ - { - alias: "220uFicCJj", - longLink: "http://www.google.com", - createdAt: nil, - expireAt: nil, - updatedAt: nil, - }, - { - alias: "yDOBcj5HIPbUAsw", - longLink: "http://www.facebook.com", - createdAt: &twoYearsAgo, - expireAt: &now, - updatedAt: &now, - }, - }, - aliases: []string{"220uFicCJj"}, - hasErr: false, - expectedURLs: []entity.URL{ - entity.URL{ - Alias: "220uFicCJj", - OriginalURL: "http://www.google.com", - CreatedAt: nil, - ExpireAt: nil, - UpdatedAt: nil, - }, - }, - }, } for _, testCase := range testCases { From dc9d9378730a98c1d0b2f2490b4206c3de5438f6 Mon Sep 17 00:00:00 2001 From: tom Date: Tue, 10 Mar 2020 21:11:36 -0700 Subject: [PATCH 07/13] revert .env file changes --- backend/.env.dist | 24 ++++++++++++++++++++++++ backend/app/adapter/db/.env | 6 +++--- 2 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 backend/.env.dist diff --git a/backend/.env.dist b/backend/.env.dist new file mode 100644 index 000000000..b00479839 --- /dev/null +++ b/backend/.env.dist @@ -0,0 +1,24 @@ +DB_HOST=localhost +DB_PORT=5432 +DB_USER=postgres +DB_PASSWORD=password +DB_NAME=short + +RECAPTCHA_SECRET=your_recaptcha_secret + +GITHUB_CLIENT_ID=your_github_id +GITHUB_CLIENT_SECRET=your_client_secret + +FACEBOOK_CLIENT_ID=facebook_client_id +FACEBOOK_CLIENT_SECRET=facebook_client_secret +FACEBOOK_REDIRECT_URI=http://localhost/oauth/facebook/sign-in/callback + +GOOGLE_CLIENT_ID=google_client_id +GOOGLE_CLIENT_SECRET=google_client_secret +GOOGLE_REDIRECT_URI=http://localhost/oauth/google/sign-in/callback + +JWT_SECRET=random +WEB_FRONTEND_URL=http://localhost:3000 +KEY_GEN_BUFFER_SIZE=10 +KEY_GEN_HOSTNAME=kgs1-staging.short-d.com +KEY_GEN_PORT=443 \ No newline at end of file diff --git a/backend/app/adapter/db/.env b/backend/app/adapter/db/.env index 5fcb53ebd..5a64fcd82 100644 --- a/backend/app/adapter/db/.env +++ b/backend/app/adapter/db/.env @@ -1,7 +1,7 @@ DB_HOST=localhost -DB_PORT=5433 +DB_PORT=5432 DB_USER=postgres -DB_PASSWORD=123456 -DB_NAME=tom +DB_PASSWORD=password +DB_NAME=short-test MIGRATION_ROOT=./migration \ No newline at end of file From 1016e4251f3eda9f233c2bd02734f9fbaa09c2c9 Mon Sep 17 00:00:00 2001 From: tom Date: Tue, 10 Mar 2020 21:43:21 -0700 Subject: [PATCH 08/13] added prepare statement --- backend/app/adapter/db/url.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/backend/app/adapter/db/url.go b/backend/app/adapter/db/url.go index 390f0f9cc..16afd6796 100644 --- a/backend/app/adapter/db/url.go +++ b/backend/app/adapter/db/url.go @@ -129,7 +129,13 @@ WHERE "%s" IN (%s);`, parameterStr, ) - rows, err := u.db.Query(statement, aliasesInterface...) + stmt, err := u.db.Prepare(statement) + if err != nil { + return urls, err + } + defer stmt.Close() + + rows, err := stmt.Query(aliasesInterface...) if err != nil { return urls, nil } From e50e35a130c956bdaa1d743a0b3d29322611ccaa Mon Sep 17 00:00:00 2001 From: tom Date: Wed, 11 Mar 2020 10:24:32 -0700 Subject: [PATCH 09/13] added TODO --- backend/app/adapter/db/url.go | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/backend/app/adapter/db/url.go b/backend/app/adapter/db/url.go index 16afd6796..b8e89ea71 100644 --- a/backend/app/adapter/db/url.go +++ b/backend/app/adapter/db/url.go @@ -99,13 +99,7 @@ WHERE "%s"=$1;`, // GetByAliases finds URLs for a list of aliases func (u URLSql) GetByAliases(aliases []string) ([]entity.URL, error) { - // create a string for aliases parameters - // it looks like: $1, $2, $3, ...... - params := make([]string, 0, len(aliases)) - for i := range aliases { - params = append(params, fmt.Sprintf("$%d", i+1)) - } - parameterStr := strings.Join(params, ", ") + parameterStr := u.composeParamListString(len(aliases)) // create a list of interface{} to hold aliases for db.Query() aliasesInterface := []interface{}{} @@ -115,6 +109,7 @@ func (u URLSql) GetByAliases(aliases []string) ([]entity.URL, error) { var urls []entity.URL + // TODO: compare performance between Query and QueryRow, consider switching to QueryRow function in the future statement := fmt.Sprintf(` SELECT "%s","%s","%s","%s","%s" FROM "%s" @@ -164,6 +159,17 @@ WHERE "%s" IN (%s);`, return urls, nil } +// composeParamListString creates a string for aliases parameters, it looks like: $1, $2, $3, ... +func (u URLSql) composeParamListString(numParams int) string { + params := make([]string, 0, numParams) + for i := 0; i < numParams; i++ { + params = append(params, fmt.Sprintf("$%d", i+1)) + } + + parameterStr := strings.Join(params, ", ") + return parameterStr +} + // NewURLSql creates URLSql func NewURLSql(db *sql.DB) *URLSql { return &URLSql{ From d36a571c22358b082755e33b4516de6894c12884 Mon Sep 17 00:00:00 2001 From: Harry Liu Date: Wed, 11 Mar 2020 17:59:08 -0700 Subject: [PATCH 10/13] Update backend/app/adapter/db/url.go --- backend/app/adapter/db/url.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/app/adapter/db/url.go b/backend/app/adapter/db/url.go index b8e89ea71..b8fb2ebfd 100644 --- a/backend/app/adapter/db/url.go +++ b/backend/app/adapter/db/url.go @@ -109,7 +109,7 @@ func (u URLSql) GetByAliases(aliases []string) ([]entity.URL, error) { var urls []entity.URL - // TODO: compare performance between Query and QueryRow, consider switching to QueryRow function in the future + // TODO: compare performance between Query and QueryRow. Prefer QueryRow for readability statement := fmt.Sprintf(` SELECT "%s","%s","%s","%s","%s" FROM "%s" From 09b97a067ac4205a20d8a01d4e02e149f73de381 Mon Sep 17 00:00:00 2001 From: Harry Liu Date: Wed, 11 Mar 2020 17:59:17 -0700 Subject: [PATCH 11/13] Update backend/app/adapter/db/url.go --- backend/app/adapter/db/url.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/app/adapter/db/url.go b/backend/app/adapter/db/url.go index b8fb2ebfd..956bd857f 100644 --- a/backend/app/adapter/db/url.go +++ b/backend/app/adapter/db/url.go @@ -159,7 +159,7 @@ WHERE "%s" IN (%s);`, return urls, nil } -// composeParamListString creates a string for aliases parameters, it looks like: $1, $2, $3, ... +// composeParamListString converts an slice to a parameters string with format: $1, $2, $3, ... func (u URLSql) composeParamListString(numParams int) string { params := make([]string, 0, numParams) for i := 0; i < numParams; i++ { From 53f7d736ab8008066d218bab5b65821563d35f8a Mon Sep 17 00:00:00 2001 From: Harry Liu Date: Wed, 11 Mar 2020 18:06:37 -0700 Subject: [PATCH 12/13] Apply suggestions from code review --- backend/app/adapter/db/url.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/app/adapter/db/url.go b/backend/app/adapter/db/url.go index 956bd857f..13f6aabec 100644 --- a/backend/app/adapter/db/url.go +++ b/backend/app/adapter/db/url.go @@ -99,7 +99,7 @@ WHERE "%s"=$1;`, // GetByAliases finds URLs for a list of aliases func (u URLSql) GetByAliases(aliases []string) ([]entity.URL, error) { - parameterStr := u.composeParamListString(len(aliases)) + parameterStr := u.composeParamList(len(aliases)) // create a list of interface{} to hold aliases for db.Query() aliasesInterface := []interface{}{} @@ -160,7 +160,7 @@ WHERE "%s" IN (%s);`, } // composeParamListString converts an slice to a parameters string with format: $1, $2, $3, ... -func (u URLSql) composeParamListString(numParams int) string { +func (u URLSql) composeParamList(numParams int) string { params := make([]string, 0, numParams) for i := 0; i < numParams; i++ { params = append(params, fmt.Sprintf("$%d", i+1)) From 480c5d1775748334333389cdd33813550da75214 Mon Sep 17 00:00:00 2001 From: Harry Liu Date: Wed, 11 Mar 2020 18:07:03 -0700 Subject: [PATCH 13/13] Update backend/app/adapter/db/url.go --- backend/app/adapter/db/url.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/app/adapter/db/url.go b/backend/app/adapter/db/url.go index 13f6aabec..978d3387c 100644 --- a/backend/app/adapter/db/url.go +++ b/backend/app/adapter/db/url.go @@ -159,7 +159,7 @@ WHERE "%s" IN (%s);`, return urls, nil } -// composeParamListString converts an slice to a parameters string with format: $1, $2, $3, ... +// composeParamList converts an slice to a parameters string with format: $1, $2, $3, ... func (u URLSql) composeParamList(numParams int) string { params := make([]string, 0, numParams) for i := 0; i < numParams; i++ {