From 695856b2056a075ee2c225dbbcc76a6a38dcc310 Mon Sep 17 00:00:00 2001 From: Victor Vrantchan Date: Sat, 20 Feb 2021 18:24:39 -0500 Subject: [PATCH] Handle unique constraint for user registration. Returns an error if the same username or email already exists. --- internal/data/user/user.go | 17 ++++++++++++----- internal/data/user/user_sqlite.go | 5 +++++ 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/internal/data/user/user.go b/internal/data/user/user.go index 8cee2150..bbc9f9e6 100644 --- a/internal/data/user/user.go +++ b/internal/data/user/user.go @@ -183,8 +183,15 @@ func (err Error) Error() string { } } -var constraints = map[string]map[string]string{ - "chk_email_not_empty": map[string]string{"email": "You must provide an email address."}, - "chk_username_not_empty": map[string]string{"username": "You must provide a username."}, - "chk_password_not_empty": map[string]string{"password": "You must provide a password."}, -} +var ( + constraints = map[string]map[string]string{ + "chk_email_not_empty": map[string]string{"email": "You must provide an email address."}, + "chk_username_not_empty": map[string]string{"username": "You must provide a username."}, + "chk_password_not_empty": map[string]string{"password": "You must provide a password."}, + } + + constraintsUnique = map[string]map[string]string{ + "users.username": map[string]string{"username": "This username already exists."}, + "users.email": map[string]string{"email": "This email already exists."}, + } +) diff --git a/internal/data/user/user_sqlite.go b/internal/data/user/user_sqlite.go index 6bd20adb..37784a63 100644 --- a/internal/data/user/user_sqlite.go +++ b/internal/data/user/user_sqlite.go @@ -151,6 +151,11 @@ func checkSqlite(err error) error { } switch sErr.Code { + case sqlite.SQLITE_CONSTRAINT_UNIQUE: + c := strings.Split(sErr.Msg, ": ") + if kv, ok := constraintsUnique[c[len(c)-1]]; ok { + return Error{invalid: kv} + } case sqlite.SQLITE_CONSTRAINT_CHECK: c := strings.Split(sErr.Msg, ": ") if kv, ok := constraints[c[len(c)-1]]; ok {