Added SteamAPI and achievement searching

This commit is contained in:
Gnarwhal 2021-02-18 02:15:09 -05:00
parent b229ff9a15
commit 627cc810ed
Signed by: Gnarwhal
GPG key ID: 0989A73D8C421174
61 changed files with 2781 additions and 903 deletions

Binary file not shown.

639
sql/DataProcs.sql Normal file
View file

@ -0,0 +1,639 @@
---------------------------------------
-- GET USER NAME AND STATS PROCEDURE --
---------------------------------------
CREATE PROCEDURE GetUserNameAndStats(
@userId INT,
@username VARCHAR(32) OUTPUT,
@completed INT OUTPUT,
@average INT OUTPUT,
@perfect INT OUTPUT
)
AS
SELECT @username = Username
FROM [User]
WHERE ID = @userId
IF @username IS NULL
BEGIN
PRINT 'No user with the specified ID was found'
RETURN 1
END
SELECT @completed = SUM(Completed)
FROM GameCompletionByUser
WHERE UserID = @userId
SELECT @average = AVG((Completed * 100) / Total)
FROM GameCompletionByUser
WHERE UserID = @userId
SELECT @perfect = COUNT(GameID)
FROM GameCompletionByUser
WHERE UserID = @userId AND Completed = Total
RETURN 0
GO
SELECT * FROM [User]
----------------------------------
-- GET USER PLATFORMS PROCEDURE --
----------------------------------
CREATE PROCEDURE GetUserPlatforms(
@userId INT
)
AS
IF NOT @userId IN (SELECT ID FROM [User])
BEGIN
PRINT 'No user with the specified ID was found'
RETURN 1
END
SELECT [Platform].ID, [PlatformName], (CASE WHEN UserID IS NOT NULL THEN 1 ELSE 0 END) AS Connected
FROM [Platform]
LEFT JOIN IsOn ON IsOn.PlatformID = [Platform].ID AND UserID = @userId
ORDER BY [Platform].ID
RETURN 0
GO
--------------------------------
-- GET USER RATINGS PROCEDURE --
--------------------------------
CREATE PROCEDURE GetUserRatings(
@userId INT
)
AS
IF NOT @userId IN (SELECT ID FROM [User])
BEGIN
PRINT 'No user with the specified ID was found'
RETURN 1
END
SELECT Game.Name AS GameName, Achievement.Name AS AchievementName, Quality, Difficulty, Rating.[Description]
FROM Rating
JOIN Achievement ON Achievement.ID = Rating.AchievementID
JOIN Game ON Game.ID = Achievement.GameID
WHERE UserID = @userId
RETURN 0
GO
------------------------------
-- GET USER IMAGE PROCEDURE --
------------------------------
CREATE PROCEDURE GetUserImage(
@userId INT
)
AS
IF NOT @userId IN (SELECT ID FROM [User])
BEGIN
PRINT 'No user with the specified ID was found'
RETURN 1
END
SELECT ProfileImage FROM [User] WHERE ID = @userId
RETURN 0
GO
------------------
-- SET USERNAME --
------------------
CREATE PROCEDURE SetUsername(
@userId INT,
@username VARCHAR(32)
)
AS
IF NOT @userId IN (SELECT ID FROM [User])
BEGIN
PRINT 'No user with the specified ID was found'
RETURN 1
END
UPDATE [User] SET Username = @username WHERE ID = @userId
RETURN 0
GO
------------------------------
-- SET USER IMAGE PROCEDURE --
------------------------------
CREATE PROCEDURE SetUserImage(
@userId INT,
@type ImageType,
@oldType ImageType OUTPUT
)
AS
IF NOT @userId IN (SELECT ID FROM [User])
BEGIN
PRINT 'No user with the specified ID was found'
RETURN 1
END
SELECT @oldType = ProfileImage FROM [User] WHERE ID = @userId
UPDATE [User] SET ProfileImage = @type WHERE ID = @userId
RETURN 0
GO
--------------------------
-- ADD USER TO PLATFORM --
--------------------------
CREATE PROCEDURE AddUserToPlatform(
@userId INT,
@platformId INT,
@platformUserID VARCHAR(32)
)
AS
IF NOT @userId IN (SELECT ID FROM [User])
BEGIN
PRINT 'No user with the specified ID was found'
RETURN 1
END
IF NOT @platformId IN (SELECT ID FROM [Platform])
BEGIN
PRINT 'No platform with the specified ID was found'
RETURN 2
END
IF EXISTS (SELECT * FROM IsOn WHERE UserID = @userId AND PlatformID = @platformId)
BEGIN
PRINT 'User already exists on specified platform'
RETURN 3
END
INSERT INTO IsOn VALUES (@userId, @platformId, @platformUserId)
RETURN 0
GO
-------------------------------
-- REMOVE USER FROM PLATFORM --
-------------------------------
CREATE PROCEDURE RemoveUserFromPlatform(
@userId INT,
@platformId INT
)
AS
IF NOT @userId IN (SELECT ID FROM [User])
BEGIN
PRINT 'No user with the specified ID was found'
RETURN 1
END
IF NOT @platformId IN (SELECT ID FROM [Platform])
BEGIN
PRINT 'No platform with the specified ID was found'
RETURN 2
END
IF NOT EXISTS (SELECT UserID FROM IsOn WHERE UserID = @userId AND PlatformID = @platformId)
BEGIN
PRINT 'User does not exist on specified platform'
RETURN 3
END
DELETE FROM IsOn WHERE UserID = @userId AND PlatformID = @platformId
DELETE FROM Progress WHERE UserID = @userId AND PlatformID = @platformId
DELETE FROM Owns WHERE UserID = @userId AND PlatformID = @platformId
RETURN 0
GO
------------------
-- ADD PLATFORM --
------------------
CREATE PROCEDURE AddPlatform(
@name VARCHAR(32),
@platformId INT OUTPUT
)
AS
IF @name IS NULL
BEGIN
PRINT 'Platform name cannot be null'
RETURN 1
END
INSERT INTO [Platform] VALUES (@name)
SET @platformId = @@IDENTITY
RETURN 0
GO
---------------------
-- REMOVE PLATFORM --
---------------------
CREATE PROCEDURE RemovePlatform(
@platformId INT
)
AS
IF NOT @platformId IN (SELECT ID FROM [Platform])
BEGIN
PRINT 'No platform with the specified ID was found'
RETURN 1
END
IF @platformId IN (SELECT PlatformID FROM ExistsOn)
BEGIN
PRINT 'All games must be removed from the specified platform before it can be removed'
RETURN 2
END
DELETE FROM [Platform] WHERE ID = @platformId
RETURN 0
GO
-------------------
-- GET PLATFORMS --
-------------------
CREATE PROCEDURE GetPlatforms
AS
SELECT ID, PlatformName FROM [Platform]
RETURN 0
GO
-----------------------
-- GET PLATFORM NAME --
-----------------------
CREATE PROCEDURE GetPlatformName(
@platformId INT,
@name VARCHAR(32) OUTPUT
)
AS
SELECT @name = PlatformName FROM [Platform] WHERE ID = @platformId
IF @name IS NULL
BEGIN
PRINT 'No platform with the specified ID was found'
RETURN 1
END
RETURN 0
GO
-----------------------
-- GET PLATFORM ICON --
-----------------------
CREATE PROCEDURE GetPlatformIcon(
@platformId INT
)
AS
IF NOT @platformId IN (SELECT ID FROM [Platform])
BEGIN
PRINT 'No platform with the specified ID was found'
RETURN 1
END
SELECT Icon FROM [Platform] WHERE ID = @platformId
RETURN 0
GO
--------------
-- ADD GAME --
--------------
CREATE PROCEDURE AddGame(
@name VARCHAR(32),
@image ImageType,
@gameId INT OUTPUT
)
AS
IF @name IS NULL
BEGIN
PRINT 'Game name cannot be null'
RETURN 1
END
IF @name IN (SELECT [Name] FROM Game)
BEGIN
PRINT 'Game with specified name already exists'
RETURN 2
END
INSERT INTO Game VALUES (@name, @image)
SET @gameId = @@IDENTITY
RETURN 0
GO
---------------------
-- ADD IF NOT GAME --
---------------------
CREATE PROCEDURE AddIfNotGame(
@name VARCHAR(32),
@image VARCHAR(11),
@gameId INT OUTPUT
)
AS
IF @name IS NULL
BEGIN
PRINT 'Game name cannot be null'
RETURN 1
END
-- Ideally game name wouldn't have to be unique, but I don't know of another way to sync games across platforms when they share no IDing system
IF NOT @name IN (SELECT [Name] FROM Game)
BEGIN
INSERT INTO Game VALUES (@name, @image)
END
SELECT @gameId = ID FROM Game WHERE [Name] = @name
RETURN 0
GO
-----------------
-- REMOVE GAME --
-----------------
CREATE PROCEDURE RemoveGame(
@gameId INT
)
AS
IF NOT @gameId IN (SELECT ID FROM Game)
BEGIN
PRINT 'No game with the specified ID was found'
RETURN 1
END
DELETE FROM Game WHERE ID = @gameId
RETURN 0
GO
-------------------
-- GET GAME ICON --
-------------------
CREATE PROCEDURE GetGameIcon(
@gameId INT
)
AS
IF NOT @gameId IN (SELECT ID FROM [Game])
BEGIN
PRINT 'No game with the specified ID was found'
RETURN 1
END
SELECT Icon FROM [Game] WHERE ID = @gameId
RETURN 0
GO
----------------------
-- ADD GAME TO USER --
----------------------
CREATE PROCEDURE AddGameToUser(
@gameId INT,
@userId INT,
@platformId INT
)
AS
IF NOT @gameId IN (SELECT ID FROM Game)
BEGIN
PRINT 'No game with the specified ID was found'
RETURN 1
END
IF NOT @userId IN (SELECT ID FROM [User])
BEGIN
PRINT 'No user with the specified ID was found'
RETURN 2
END
IF NOT @platformId IN (SELECT ID FROM [Platform])
BEGIN
PRINT 'No platform with the specified ID was found'
RETURN 3
END
IF NOT EXISTS (SELECT * FROM IsOn WHERE UserID = @userId AND PlatformID = @platformId)
BEGIN
PRINT 'User is not on specified platform'
RETURN 4
END
IF EXISTS (SELECT * FROM Owns WHERE GameID = @gameId AND UserID = @userId AND PlatformID = @platformId)
BEGIN
PRINT 'Game is already owned by specified user on specified platform'
RETURN 5
END
INSERT INTO Owns VALUES (@userId, @gameId, @platformId)
RETURN 0
GO
---------------------------
-- REMOVE GAME FROM USER --
---------------------------
CREATE PROCEDURE RemoveGameFromUser(
@gameId INT,
@userId INT,
@platformId INT
)
AS
IF NOT @gameId IN (SELECT ID FROM Game)
BEGIN
PRINT 'No game with the specified ID was found'
RETURN 1
END
IF NOT @userId IN (SELECT ID FROM [User])
BEGIN
PRINT 'No user with the specified ID was found'
RETURN 2
END
IF NOT @platformId IN (SELECT ID FROM [Platform])
BEGIN
PRINT 'No platform with the specified ID was found'
RETURN 3
END
IF NOT EXISTS (SELECT * FROM Owns WHERE GameID = @gameId AND UserID = @userId AND PlatformID = @platformId)
BEGIN
PRINT 'Game is not owned by specified user on specified platform'
RETURN 4
END
DELETE FROM Owns WHERE UserID = @userId AND GameID = @gameId AND PlatformID = @platformId
RETURN 0
GO
--------------------------
-- ADD GAME TO PLATFORM --
--------------------------
CREATE PROCEDURE AddGameToPlatform(
@gameId INT,
@platformId INT,
@platformGameId VARCHAR(32)
)
AS
IF NOT @gameId IN (SELECT ID FROM Game)
BEGIN
PRINT 'No game with the specified ID was found'
RETURN 1
END
IF NOT @platformId IN (SELECT ID FROM [Platform])
BEGIN
PRINT 'No platform with the specified ID was found'
RETURN 2
END
IF EXISTS (SELECT * FROM ExistsOn WHERE GameID = @gameId AND PlatformID = @platformId)
BEGIN
PRINT 'Game already exists on specified platform'
RETURN 3
END
INSERT INTO ExistsOn VALUES (@gameId, @platformId, @platformGameId)
RETURN 0
GO
-------------------------------
-- REMOVE GAME FROM PLATFORM --
-------------------------------
CREATE PROCEDURE RemoveGameFromPlatform(
@gameId INT,
@platformId INT
)
AS
IF NOT @gameId IN (SELECT ID FROM Game)
BEGIN
PRINT 'No game with the specified ID was found'
RETURN 1
END
IF NOT @platformId IN (SELECT ID FROM [Platform])
BEGIN
PRINT 'No platform with the specified ID was found'
RETURN 2
END
IF NOT EXISTS (SELECT * FROM ExistsOn WHERE GameID = @gameId AND PlatformID = @platformId)
BEGIN
PRINT 'Game does not exist on specified platform'
RETURN 3
END
DELETE FROM ExistsOn WHERE GameID = @gameId AND PlatformID = @platformId
RETURN 0
GO
---------------------
-- ADD ACHIEVEMENT --
---------------------
CREATE PROCEDURE AddAchievement(
@gameId INT,
@name VARCHAR(128),
@description VARCHAR(512),
@stages INT,
@image ImageType,
@achievementId INT OUTPUT
)
AS
IF NOT @gameId IN (SELECT ID FROM Game)
BEGIN
PRINT 'No game with the specified ID was found'
RETURN 1
END
IF @name IS NULL
BEGIN
PRINT 'Achievement name cannot be null'
RETURN 2
END
IF @stages IS NULL
BEGIN
PRINT 'Achievement stages cannot be null'
RETURN 3
END
IF @name IN (SELECT [Name] FROM Achievement WHERE GameID = @gameId)
BEGIN
PRINT 'Achievement with specified name already exists for specified game'
RETURN 4
END
INSERT INTO Achievement VALUES (@gameId, @name, @description, @stages, @image)
SET @achievementId = @@IDENTITY
RETURN 0
GO
----------------------------
-- ADD IF NOT ACHIEVEMENT --
----------------------------
CREATE PROCEDURE AddIfNotAchievement(
@gameId INT,
@name VARCHAR(128),
@description VARCHAR(512),
@stages INT,
@image VARCHAR(11),
@achievementId INT OUTPUT
)
AS
IF NOT @gameId IN (SELECT ID FROM Game)
BEGIN
PRINT 'No game with the specified ID was found'
RETURN 1
END
IF @name IS NULL
BEGIN
PRINT 'Achievement name cannot be null'
RETURN 2
END
IF @stages IS NULL
BEGIN
PRINT 'Achievement stages cannot be null'
RETURN 3
END
IF NOT @name IN (SELECT [Name] FROM Achievement WHERE GameID = @gameId)
BEGIN
INSERT INTO Achievement VALUES (@gameId, @name, @description, @stages, @image)
END
SELECT @achievementId = ID FROM Achievement WHERE [Name] = @name AND GameID = @gameId
RETURN 0
GO
------------------------
-- REMOVE ACHIEVEMENT --
------------------------
CREATE PROCEDURE RemoveAchievement(
@achievementId INT
)
AS
IF NOT @achievementId IN (SELECT ID FROM Achievement)
BEGIN
PRINT 'No achievement with the specified ID was found'
RETURN 1
END
DELETE FROM Achievement WHERE ID = @achievementId
RETURN 0
GO
--------------------------
-- GET ACHIEVEMENT ICON --
--------------------------
CREATE PROCEDURE GetAchievementIcon(
@achievementId INT
)
AS
IF NOT @achievementId IN (SELECT ID FROM Achievement)
BEGIN
PRINT 'No achievement with the specified ID was found'
RETURN 1
END
SELECT Icon FROM Achievement WHERE ID = @achievementId
RETURN 0
GO
---------------------------------------
-- SET ACHIEVEMENT PROGRESS FOR USER --
---------------------------------------
CREATE PROCEDURE SetAchievementProgressForUser(
@userId INT,
@platformId INT,
@achievementId INT,
@progress INT
)
AS
IF NOT @userId IN (SELECT ID FROM [User])
BEGIN
PRINT 'No user with the specified ID was found'
RETURN 1
END
IF NOT @platformId IN (SELECT ID FROM [Platform])
BEGIN
PRINT 'No platform with the specified ID was found'
RETURN 2
END
IF NOT @achievementId IN (SELECT ID FROM Achievement)
BEGIN
PRINT 'No achievement with the specified ID was found'
RETURN 3
END
IF EXISTS (SELECT * FROM Progress WHERE AchievementID = @achievementId AND UserID = @userId AND PlatformID = @platformId)
BEGIN
UPDATE Progress SET Progress = @progress WHERE AchievementID = @achievementId AND UserID = @userId AND PlatformID = @platformId
END
ELSE
BEGIN
INSERT INTO Progress VALUES (@userId, @platformId, @achievementId, @progress)
END
RETURN 0
GO

60
sql/SearchProcs.sql Normal file
View file

@ -0,0 +1,60 @@
-----------------------
-- SEARCH ACHIEVEMENTS --
-----------------------
CREATE PROCEDURE SearchAchievements(
@searchTerm VARCHAR(32),
@userId INT,
@completed BIT,
@minCompletion FLOAT,
@maxCompletion FLOAT,
@minDifficulty FLOAT,
@maxDifficulty FLOAT,
@minQuality FLOAT,
@maxQuality FLOAT
)
AS
IF @userId IS NULL AND @completed = 1
BEGIN
PRINT 'Cannot search for completed achievements with no user specified'
RETURN 1
END
IF @searchTerm IS NULL OR @searchTerm = ''
SET @searchTerm = '%'
ELSE
SET @searchTerm = '%' + @searchTerm + '%'
PRINT @searchTerm
IF NOT @userId IS NULL
SELECT TOP 100 Game.[Name] AS Game, Achievement.[Name], Completion, Difficulty, Quality
FROM Achievement
JOIN MaxProgress ON AchievementID = Achievement.ID AND UserID = @userId
JOIN Game ON Game.ID = GameID
JOIN AchievementCompletion AC ON AC.ID = Achievement.ID
JOIN AchievementRatings AR ON AR.ID = Achievement.ID
WHERE (Game.[Name] LIKE @searchTerm OR Achievement.[Name] LIKE @searchTerm)
AND (@completed <> 1 OR Progress = Stages )
AND (@minCompletion IS NULL OR @minCompletion <= Completion)
AND (@maxCompletion IS NULL OR @maxCompletion >= Completion)
AND (@minDifficulty IS NULL OR @minDifficulty <= Difficulty)
AND (@maxDifficulty IS NULL OR @maxDifficulty >= Difficulty)
AND (@minQuality IS NULL OR @minQuality <= Quality )
AND (@maxQuality IS NULL OR @maxQuality >= Quality )
ELSE
SELECT TOP 100 Achievement.ID, Game.[Name] AS Game, Achievement.[Name], Completion, Quality, Difficulty
FROM Achievement
JOIN Game ON Game.ID = GameID
JOIN AchievementCompletion AC ON AC.ID = Achievement.ID
JOIN AchievementRatings AR ON AR.ID = Achievement.ID
WHERE (Game.[Name] LIKE @searchTerm OR Achievement.[Name] LIKE @searchTerm)
AND (@minCompletion IS NULL OR @minCompletion <= Completion)
AND (@maxCompletion IS NULL OR @maxCompletion >= Completion)
AND (@minDifficulty IS NULL OR @minDifficulty <= Difficulty)
AND (@maxDifficulty IS NULL OR @maxDifficulty >= Difficulty)
AND (@minQuality IS NULL OR @minQuality <= Quality )
AND (@maxQuality IS NULL OR @maxQuality >= Quality )
RETURN 0
GO
EXEC SearchAchievements '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL

View file

@ -27,6 +27,9 @@
-----------------------------
--CREATE TYPE ImageType FROM VARCHAR(4) NULL
--GO
CREATE TABLE [User] (
ID INT IDENTITY(0, 1) NOT NULL,
Email VARCHAR(254) NOT NULL,
@ -36,7 +39,9 @@ CREATE TABLE [User] (
Hue INT NOT NULL
CONSTRAINT HueDefault DEFAULT 0
CONSTRAINT HueConstraint CHECK (0 <= Hue AND Hue <= 360),
PFP VARCHAR(11) NULL,
ProfileImage ImageType,
[Admin] BIT NOT NULL
CONSTRAINT AdmivDefault DEFAULT 0,
Verified BIT NOT NULL
CONSTRAINT VerifiedDefault DEFAULT 0
PRIMARY KEY(ID)
@ -44,14 +49,15 @@ CREATE TABLE [User] (
CREATE TABLE [Platform] (
ID INT IDENTITY(0, 1) NOT NULL,
PlatformName VARCHAR(32) NOT NULL
PlatformName VARCHAR(32) NOT NULL,
Icon ImageType
PRIMARY KEY(ID)
)
CREATE TABLE [Game] (
ID INT IDENTITY(0, 1) NOT NULL,
Name VARCHAR(32) NOT NULL,
Thumbnail VARCHAR(256) NULL
Icon ImageType
PRIMARY KEY(ID)
)
@ -61,7 +67,7 @@ CREATE TABLE [Achievement] (
Name VARCHAR(128) NOT NULL,
Description VARCHAR(512) NULL,
Stages INT NOT NULL,
Thumbnail VARCHAR(256) NULL
Icon ImageType
PRIMARY KEY(ID)
FOREIGN KEY(GameID) REFERENCES [Game](ID)
ON UPDATE CASCADE
@ -89,7 +95,7 @@ CREATE TABLE [Progress] (
PlatformID INT NOT NULL,
AchievementID INT NOT NULL,
Progress INT NOT NULL
PRIMARY KEY(UserID, AchievementID)
PRIMARY KEY(UserID, PlatformID, AchievementID)
FOREIGN KEY(UserID) REFERENCES [User](ID)
ON UPDATE CASCADE
ON DELETE CASCADE,
@ -117,7 +123,7 @@ CREATE TABLE [IsOn] (
CREATE TABLE [ExistsOn] (
GameID INT NOT NULL,
PlatformID INT NOT NULL,
PlatformGameID INT NOT NULL
PlatformGameID VARCHAR(32) NOT NULL
PRIMARY KEY(GameID, PlatformID)
FOREIGN KEY(GameID) REFERENCES [Game](ID)
ON UPDATE CASCADE

View file

@ -1,186 +0,0 @@
---------------------------------------
-- GET USER NAME AND STATS PROCEDURE --
---------------------------------------
CREATE PROCEDURE GetUserNameAndStats(
@userId INT,
@username VARCHAR(32) OUTPUT,
@completed INT OUTPUT,
@average INT OUTPUT,
@perfect INT OUTPUT
)
AS
BEGIN TRANSACTION
SELECT @username = Username
FROM [User]
WHERE ID = @userId
IF @username IS NULL
BEGIN
PRINT 'No user found with specified id'
ROLLBACK TRANSACTION
RETURN 1
END
DECLARE @progress TABLE (GameID INT, Completed INT, Total INT)
INSERT INTO @progress
SELECT GameID, SUM(CASE WHEN Progress.Progress = Achievement.Stages THEN 1 ELSE 0 END) AS Completed, COUNT(AchievementID) AS Total
FROM Achievement
JOIN Progress ON
Progress.UserID = @userId
AND Progress.AchievementID = Achievement.ID
GROUP BY GameID
COMMIT TRANSACTION
SELECT @completed = SUM(Completed)
FROM @progress
SELECT @average = AVG((Completed * 100) / Total)
FROM @progress
SELECT @perfect = COUNT(GameID)
FROM @progress
WHERE Completed = Total
RETURN 0
GO
----------------------------------
-- GET USER PLATFORMS PROCEDURE --
----------------------------------
CREATE PROCEDURE GetUserPlatforms(
@userId INT
)
AS
SELECT [Platform].ID, [PlatformName], (CASE WHEN UserID IS NOT NULL THEN 1 ELSE 0 END) AS Connected
FROM [Platform]
LEFT JOIN IsOn ON IsOn.PlatformID = [Platform].ID
ORDER BY [Platform].ID
GO
--------------------------------
-- GET USER RATINGS PROCEDURE --
--------------------------------
CREATE PROCEDURE GetUserRatings(
@userId INT
)
AS
SELECT Game.Name AS GameName, Achievement.Name AS AchievementName, Quality, Difficulty, Rating.[Description]
FROM Rating
JOIN Achievement ON Achievement.ID = Rating.AchievementID
JOIN Game ON Game.ID = Achievement.GameID
WHERE UserID = @userId
GO
------------------------------
-- GET USER IMAGE PROCEDURE --
------------------------------
CREATE PROCEDURE GetUserImage(
@userId INT
)
AS
IF NOT EXISTS (SELECT * FROM [User] WHERE ID = @userId)
BEGIN
PRINT 'No user with specified ID found'
RETURN 1
END
SELECT PFP FROM [User] WHERE ID = @userId
RETURN 0
GO
------------------
-- SET USERNAME --
------------------
CREATE PROCEDURE SetUsername(
@userId INT,
@username VARCHAR(32)
)
AS
IF NOT EXISTS (SELECT * FROM [User] WHERE ID = @userId)
BEGIN
PRINT 'No user with specified ID found'
RETURN 1
END
UPDATE [User] SET Username = @username WHERE ID = @userId
RETURN 0
GO
------------------------------
-- SET USER IMAGE PROCEDURE --
------------------------------
CREATE PROCEDURE SetUserImage(
@userId INT,
@type VARCHAR(11)
)
AS
IF NOT EXISTS (SELECT * FROM [User] WHERE ID = @userId)
BEGIN
PRINT 'No user with specified ID found'
RETURN 1
END
UPDATE [User] SET PFP = @type WHERE ID = @userId
RETURN 0
GO
---------------------------
-- ADD USER TO PROCEDURE --
---------------------------
CREATE PROCEDURE AddPlatform(
@userId INT,
@platformId INT,
@platformUserID VARCHAR(32)
)
AS
IF NOT EXISTS (SELECT * FROM [User] WHERE ID = @userId)
BEGIN
PRINT 'No user with specified ID found'
RETURN 1
END
IF NOT EXISTS (SELECT * FROM [Platform] WHERE ID = @platformId)
BEGIN
PRINT 'No platform with specified ID found'
RETURN 2
END
IF EXISTS (SELECT * FROM IsOn WHERE UserID = @userId AND PlatformID = @platformId)
BEGIN
PRINT 'User already exists on platform'
RETURN 3
END
INSERT INTO IsOn VALUES (@userId, @platformId, @platformUserId)
RETURN 0
GO
--------------------------------
-- REMOVE USER FROM PROCEDURE --
--------------------------------
CREATE PROCEDURE RemovePlatform(
@userId INT,
@platformId INT
)
AS
IF NOT EXISTS (SELECT * FROM [User] WHERE ID = @userId)
BEGIN
PRINT 'No user with specified ID found'
RETURN 1
END
IF NOT EXISTS (SELECT * FROM [Platform] WHERE ID = @platformId)
BEGIN
PRINT 'No platform with specified ID found'
RETURN 2
END
IF NOT EXISTS (SELECT * FROM IsOn WHERE UserID = @userId AND PlatformID = @platformId)
BEGIN
PRINT 'User does not exist on platform'
RETURN 3
END
DELETE FROM IsOn WHERE UserID = @userId AND PlatformID = @platformId
RETURN 0
GO

35
sql/Views.sql Normal file
View file

@ -0,0 +1,35 @@
-- The maximum progress a user has on an achievement across all platforms
CREATE VIEW MaxProgress
AS
SELECT UserID, AchievementID, MAX(Progress) AS Progress
FROM Progress
GROUP BY UserID, AchievementID
GO
-- List of games and users with the number of completed achievements out of the total achievements the user has completed
CREATE VIEW GameCompletionByUser
AS
SELECT UserID, GameID, SUM(CASE WHEN Progress = Stages THEN 1 ELSE 0 END) AS Completed, COUNT(AchievementID) AS Total
FROM Achievement
JOIN MaxProgress ON AchievementID = Achievement.ID
GROUP BY UserID, GameID
GO
-- List of achievements and the percentage of people who have completed it
CREATE VIEW AchievementCompletion
AS
SELECT Achievement.ID, (CASE WHEN COUNT(UserID) = 0 THEN NULL ELSE (SUM(CASE WHEN Progress = Stages THEN 1 ELSE 0 END) * 100 / COUNT(UserID)) END) AS Completion
FROM Achievement
LEFT JOIN MaxProgress ON AchievementID = Achievement.ID
GROUP BY Achievement.ID
GO
-- List of achievements and their average quality and difficulty ratings filling with null as necessary
CREATE VIEW AchievementRatings
AS
SELECT Achievement.ID, AVG(Quality) AS Quality, AVG(Difficulty) AS Difficulty
FROM Achievement
LEFT JOIN Rating ON AchievementID = Achievement.ID
GROUP BY Achievement.ID
GO