152 lines
4.9 KiB
Transact-SQL
152 lines
4.9 KiB
Transact-SQL
-- ============================================================
|
|
-- spOnboarding: User/Client registration
|
|
-- ============================================================
|
|
CREATE OR ALTER PROCEDURE [dbo].[spOnboarding]
|
|
@action VARCHAR(50),
|
|
@rqst NVARCHAR(MAX),
|
|
@resp NVARCHAR(MAX) OUTPUT
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
|
|
DECLARE @j NVARCHAR(MAX) = ISNULL(@rqst, N'{}');
|
|
|
|
------------------------------------------------------------------------
|
|
-- ACTION: status
|
|
-- Check if user is registered and has client access
|
|
------------------------------------------------------------------------
|
|
IF @action = 'status'
|
|
BEGIN
|
|
DECLARE @sSubject NVARCHAR(200) = NULLIF(JSON_VALUE(@j, '$.subject'), '');
|
|
DECLARE @sEmail NVARCHAR(256) = NULLIF(JSON_VALUE(@j, '$.email'), '');
|
|
|
|
DECLARE @sUserId UNIQUEIDENTIFIER;
|
|
DECLARE @sUserEmail NVARCHAR(256);
|
|
|
|
SELECT @sUserId = usrId, @sUserEmail = usrEmail
|
|
FROM dbo.tbUser
|
|
WHERE usrEntraSub = @sSubject;
|
|
|
|
-- User doesn't exist
|
|
IF @sUserId IS NULL
|
|
BEGIN
|
|
SET @resp = (
|
|
SELECT
|
|
CAST(1 AS BIT) AS ok,
|
|
CAST(0 AS BIT) AS isRegistered,
|
|
@sEmail AS email
|
|
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
|
|
);
|
|
RETURN;
|
|
END
|
|
|
|
-- Check for client access
|
|
DECLARE @clients NVARCHAR(MAX);
|
|
SELECT @clients = (
|
|
SELECT
|
|
c.cltId AS clientId,
|
|
c.cltName AS clientName,
|
|
r.ucrRole AS [role]
|
|
FROM dbo.tbUserClientRole r
|
|
JOIN dbo.tbClient c ON c.cltId = r.ucrCltId AND c.cltStatus = 'Active'
|
|
WHERE r.ucrUsrId = @sUserId
|
|
FOR JSON PATH
|
|
);
|
|
|
|
IF @clients IS NULL OR @clients = '[]'
|
|
BEGIN
|
|
SET @resp = (
|
|
SELECT
|
|
CAST(1 AS BIT) AS ok,
|
|
CAST(0 AS BIT) AS isRegistered,
|
|
@sUserId AS userId,
|
|
@sUserEmail AS email
|
|
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
|
|
);
|
|
RETURN;
|
|
END
|
|
|
|
SET @resp = (
|
|
SELECT
|
|
CAST(1 AS BIT) AS ok,
|
|
CAST(1 AS BIT) AS isRegistered,
|
|
@sUserId AS userId,
|
|
@sUserEmail AS email,
|
|
JSON_QUERY(@clients) AS clients
|
|
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
|
|
);
|
|
RETURN;
|
|
END
|
|
|
|
------------------------------------------------------------------------
|
|
-- ACTION: register
|
|
-- Creates client + links user as Admin
|
|
------------------------------------------------------------------------
|
|
IF @action = 'register'
|
|
BEGIN
|
|
DECLARE @provider VARCHAR(30) = NULLIF(JSON_VALUE(@j, '$.provider'), '');
|
|
DECLARE @subject NVARCHAR(200) = NULLIF(JSON_VALUE(@j, '$.subject'), '');
|
|
DECLARE @email NVARCHAR(256) = NULLIF(JSON_VALUE(@j, '$.email'), '');
|
|
DECLARE @displayName NVARCHAR(256) = NULLIF(JSON_VALUE(@j, '$.displayName'), '');
|
|
DECLARE @clientName NVARCHAR(200) = NULLIF(JSON_VALUE(@j, '$.clientName'), '');
|
|
|
|
-- Validation
|
|
IF @provider IS NULL OR @subject IS NULL
|
|
BEGIN
|
|
SET @resp = N'{"ok":false,"error":"provider and subject are required"}';
|
|
RETURN;
|
|
END
|
|
|
|
IF @clientName IS NULL
|
|
BEGIN
|
|
SET @resp = N'{"ok":false,"error":"clientName is required"}';
|
|
RETURN;
|
|
END
|
|
|
|
-- Find or create user
|
|
DECLARE @userId UNIQUEIDENTIFIER;
|
|
|
|
SELECT @userId = usrId
|
|
FROM dbo.tbUser
|
|
WHERE usrEntraSub = @subject;
|
|
|
|
IF @userId IS NULL
|
|
BEGIN
|
|
SET @userId = NEWID();
|
|
INSERT dbo.tbUser (usrId, usrEntraSub, usrProvider, usrSubject, usrEmail, usrDisplayName, usrStatus)
|
|
VALUES (@userId, @subject, @provider, @subject, @email, @displayName, 'Active');
|
|
END
|
|
|
|
-- Check if user already has client access
|
|
IF EXISTS (SELECT 1 FROM dbo.tbUserClientRole WHERE ucrUsrId = @userId)
|
|
BEGIN
|
|
SET @resp = N'{"ok":false,"error":"User is already registered"}';
|
|
RETURN;
|
|
END
|
|
|
|
-- Create client
|
|
DECLARE @clientId UNIQUEIDENTIFIER = NEWID();
|
|
INSERT dbo.tbClient (cltId, cltName, cltStatus)
|
|
VALUES (@clientId, @clientName, 'Active');
|
|
|
|
-- Link user as Admin
|
|
INSERT dbo.tbUserClientRole (ucrUsrId, ucrCltId, ucrRole)
|
|
VALUES (@userId, @clientId, 'Admin');
|
|
|
|
-- Return success
|
|
SET @resp = (
|
|
SELECT
|
|
CAST(1 AS BIT) AS ok,
|
|
@userId AS userId,
|
|
@clientId AS clientId,
|
|
@clientName AS clientName,
|
|
'Admin' AS [role]
|
|
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
|
|
);
|
|
RETURN;
|
|
END
|
|
|
|
SET @resp = N'{"ok":false,"error":"Unknown action"}';
|
|
END
|
|
GO
|