From 1de4e9c0986272aa92af1be1f80c8cc541587839 Mon Sep 17 00:00:00 2001 From: jscyo Date: Thu, 14 Apr 2022 17:23:27 +0530 Subject: [PATCH 1/2] adds functions for setting a role for a user and retriving user roles --- .../supertokens/storage/postgresql/Start.java | 24 ++++++++++++++++--- .../postgresql/queries/UserRolesQueries.java | 19 +++++++++++++++ 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/supertokens/storage/postgresql/Start.java b/src/main/java/io/supertokens/storage/postgresql/Start.java index 39a7d6b8..c4e7174a 100644 --- a/src/main/java/io/supertokens/storage/postgresql/Start.java +++ b/src/main/java/io/supertokens/storage/postgresql/Start.java @@ -1450,14 +1450,32 @@ public int deleteUserMetadata(String userId) throws StorageQueryException { @Override public void addRoleToUser(String userId, String role) throws StorageQueryException, UnknownRoleException, DuplicateUserRoleMappingException { - // TODO + + try { + UserRolesQueries.addRoleToUser(this, userId, role); + } catch (SQLException e) { + if (e instanceof PSQLException) { + PostgreSQLConfig config = Config.getConfig(this); + ServerErrorMessage serverErrorMessage = ((PSQLException) e).getServerErrorMessage(); + if (isForeignKeyConstraintError(serverErrorMessage, config.getUserRolesTable(), "role")) { + throw new UnknownRoleException(); + } + if (isPrimaryKeyError(serverErrorMessage, config.getUserRolesTable())) { + throw new DuplicateUserRoleMappingException(); + } + } + throw new StorageQueryException(e); + } } @Override public String[] getRolesForUser(String userId) throws StorageQueryException { - // TODO - return new String[0]; + try { + return UserRolesQueries.getRolesForUser(this, userId); + } catch (SQLException e) { + throw new StorageQueryException(e); + } } @Override diff --git a/src/main/java/io/supertokens/storage/postgresql/queries/UserRolesQueries.java b/src/main/java/io/supertokens/storage/postgresql/queries/UserRolesQueries.java index 8c5e2b75..0c97b8f2 100644 --- a/src/main/java/io/supertokens/storage/postgresql/queries/UserRolesQueries.java +++ b/src/main/java/io/supertokens/storage/postgresql/queries/UserRolesQueries.java @@ -134,4 +134,23 @@ public static String[] getRoles(Start start) throws SQLException, StorageQueryEx }); } + public static int addRoleToUser(Start start, String userId, String role) + throws SQLException, StorageQueryException { + String QUERY = "INSERT INTO " + getConfig(start).getUserRolesTable() + "(user_id, role) VALUES(?, ?);"; + return update(start, QUERY, pst -> { + pst.setString(1, userId); + pst.setString(2, role); + }); + } + + public static String[] getRolesForUser(Start start, String userId) throws SQLException, StorageQueryException { + String QUERY = "SELECT role FROM " + getConfig(start).getUserRolesTable() + " WHERE user_id = ? ;"; + return execute(start, QUERY, pst -> pst.setString(1, userId), result -> { + ArrayList roles = new ArrayList<>(); + while (result.next()) { + roles.add(result.getString("role")); + } + return roles.toArray(String[]::new); + }); + } } From 4b103e37beb328965d6a63dce8f8ce47a5193599 Mon Sep 17 00:00:00 2001 From: jscyo Date: Thu, 14 Apr 2022 17:29:51 +0530 Subject: [PATCH 2/2] fixs --- .../supertokens/storage/postgresql/queries/UserRolesQueries.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/io/supertokens/storage/postgresql/queries/UserRolesQueries.java b/src/main/java/io/supertokens/storage/postgresql/queries/UserRolesQueries.java index 0c97b8f2..827cea4e 100644 --- a/src/main/java/io/supertokens/storage/postgresql/queries/UserRolesQueries.java +++ b/src/main/java/io/supertokens/storage/postgresql/queries/UserRolesQueries.java @@ -145,6 +145,7 @@ public static int addRoleToUser(Start start, String userId, String role) public static String[] getRolesForUser(Start start, String userId) throws SQLException, StorageQueryException { String QUERY = "SELECT role FROM " + getConfig(start).getUserRolesTable() + " WHERE user_id = ? ;"; + return execute(start, QUERY, pst -> pst.setString(1, userId), result -> { ArrayList roles = new ArrayList<>(); while (result.next()) {