I'm trying to make a system where you spawn as a rat in a game I'm making, but the system isn't working despite me having looked up multiple tutorials on the subject. So how do I fix this? Here is the code in "PlayerHandler":

local ss = game:GetService("ServerStorage")
local bs = game:GetService("BadgeService")

local rmodule = require(ss.RatModule)
local umodule = require(ss.UserModule)
repeat wait() until rmodule and umodule

game.Players.PlayerAdded:Connect(function(player)
	umodule.AwardBadge(player, *WELCOMEBADGEID*) -- badge hidden for obvious reasons
	
	player.CharacterAdded:Wait()
	local rat = umodule.GetRatFromName("Test Rat")
	
	-- RAT PROCESS:
	-- morphing
	local model = ss.RatModels:FindFirstChild(rat.Model):Clone()
	model.Name = player.Name
	model:SetPrimaryPartCFrame(player.Character:GetPrimaryPartCFrame())

	for _, v in pairs(model:GetDescendants()) do
		if v:IsA("BasePart") or v:IsA("MeshPart") then
			v.Anchored = false
		end
	end

	-- adding scripts
	local scripts = ss.RatScripts:FindFirstChild(rat.ScriptsName)
	if scripts then
		for _, _script in pairs(scripts:GetChildren()) do
			_script:Clone().Parent = model
		end
	end

	-- finishing morph
	player.Character:Destroy()
	player.Character = model
	model.Parent = workspace
end)

Here is the code for the "UserModule":

local dservice = game:GetService("DataStoreService")
local ds = dservice:GetDataStore(*DATASTORENAME*) -- name not shown for privacy purposes

local module = {}

module.Defaults = {
	Defaults = {"Rats", "SelectedRat", "Money"}, -- In Order
	RatDefaults = {
		{
			["Name"] = "Rat",
			["Model"] = "Rat"
		}
	},
	RatDefault = "Rat",
	MoneyDefault = 0
}

function module.GetRatFromName(name)
	local ss = script.Parent
	local rmodule = require(ss.RatModule)
	repeat wait() until rmodule
	for _, rat in pairs(rmodule.Rats) do
		if rat.Name == name then
			return rat
		end
	end
	return nil
end

function module.GetUserData(player)
	local user = {}
	
	local rats = ds:GetAsync("RatData_Rats_" .. player.UserId)
	if rats then
		user.Rats = rats
		-- print("Player rat data exists!")
	end
	
	local selected = ds:GetAsync("RatData_SelectedRat_" .. player.UserId)
	if selected then
		user.SelectedRat = selected
		-- print("Player selected data exists!")
	end
	
	local money = ds:GetAsync("RatData_Money_" .. player.UserId)
	if money then
		user.Money = money
		-- print("Player money data exists!")
	end
	
	return user
end

function module.SetDefaults(player)
	local user = module.GetUserData(player)
	for i = 1, #module.Defaults.Defaults do
		user[module.Defaults.Defaults[i]] = module.Defaults[i + 1]
		ds:SetAsync("RatData_" .. module.Defaults.Defaults[i] .. "_" .. player.UserId, module.Defaults[i + 1])
	end
	return user
end

function module.AwardRat(data, player)
	local user = module.GetUserData(player)
	for _, rat in pairs(user.Rats) do
		if rat.Name == data.Name then
			return false, player.Name .. " already has rat: " .. data.Name
		end
	end
	table.insert(user.Rats, data)
	ds:SetAsync("RatData_Rats_" .. player.UserId, user.Rats)
	return true, player.Name .. "got rat: " .. data.Name
end

function module.AwardBadge(player, id)
	local bs = game:GetService("BadgeService")
	if not bs:UserHasBadgeAsync(player.UserId, id) then
		local success, message = pcall(function()
			bs:AwardBadge(player.UserId, id)
		end)
		return success, message
	end
	return false, "User already has badge"
end

function module.CheckRat(data, player)
	local user = module.GetUserData(player)
	for _, rat in pairs(user.Rats) do
		if rat.Name == data.Name then
			return true
		end
	end
	return false
end

return module

And lastly, here's the "RatModule":

local module = {
	["Rats"] = {
		{
			["Name"] = "Rat",
			["Model"] = "Rat",
			["ScriptsName"] = "Rat",
			["Description"] = "the default rat",
			["UnlockType"] = "Default"
		},
		{
			["Name"] = "Floppa",
			["Model"] = "Floppa",
			["ScriptsName"] = "Floppa",
			["Description"] = "play raf(2)",
			["UnlockType"] = "Purchasable"
		},
		{
			["Name"] = "Test Rat",
			["Model"] = "TestRat",
			["ScriptsName"] = "Rat",
			["Description"] = *DESCRIPTION*, -- description not shown for surprise reasons
			["UnlockType"] = "Staff"
		}
	},
	["RatType"] = {
		["Default"] = 0,
		["Unlockable"] = 1,
		["Purchasable"] = 2,
		["Staff"] = 3,
	}
}

return module