protected User insertUser()

in app/src/main/java/com/amazon/aws/partners/saasfactory/pgrls/service/TenantServiceImpl.java [156:194]


	protected User insertUser(User user) {
		NamedParameterJdbcTemplate jdbc = new NamedParameterJdbcTemplate(jdbc());
		GeneratedKeyHolder generated = new GeneratedKeyHolder();
		StringBuilder sql = new StringBuilder("INSERT INTO tenant_user (tenant_id, email, given_name, family_name) VALUES (:tenant_id, :email, :given_name, :family_name)");
		MapSqlParameterSource params = new MapSqlParameterSource()
				.addValue("tenant_id", user.getTenant().getId())
				.addValue("email", user.getEmail())
				.addValue("given_name", user.getGivenName())
				.addValue("family_name", user.getFamilyName());
		try {
			int update = jdbc.update(sql.toString(), params, generated);
			if (update == 1) {
				UUID userId = (UUID) generated.getKeys().get("user_id");
				user.setId(userId);
				user.setTenant(getTenant(user.getTenant().getId()));
			}
		} catch (BadSqlGrammarException e) {
			// Postgres will throw an Access Rule Violation error with condition
			// insufficient_privilege if an INSERT fails to satisfy an RLS policy.
			// ERROR:  42501: new row violates row-level security policy for table...
			if ("42501".equals(e.getSQLException().getSQLState())) {
				throw new UnauthorizedException();
			} else {
				throw e;
			}
		} catch (DataAccessException e) {
			if (e.getRootCause() instanceof SQLException) {
				SQLException sqlError = (SQLException) e.getRootCause();
				if ("23505".equals(sqlError.getSQLState())) {
					throw new UniqueRecordException(user.getEmail() + " already exists", e);
				} else {
					throw e;
				}
			} else {
				throw e;
			}
		}
		return user;
	}