diff --git a/src/controllers/api/createGuildController.ts b/src/controllers/api/createGuildController.ts new file mode 100644 index 00000000..c8828b03 --- /dev/null +++ b/src/controllers/api/createGuildController.ts @@ -0,0 +1,35 @@ +import { RequestHandler } from "express"; +import { getJSONfromString } from "@/src/helpers/stringHelpers"; +import { Inventory } from "@/src/models/inventoryModels/inventoryModel"; +import { Guild } from "@/src/models/guildModel"; +import { IGuild, ICreateGuildRequest } from "@/src/types/guildTypes"; + +const createGuildController: RequestHandler = async (req, res) => { + let payload: ICreateGuildRequest = getJSONfromString(req.body.toString()); + + // Create guild on database + let guild = new Guild({ + Name: payload.guildName + } satisfies IGuild); + await guild.save(); + + // Update inventory + let inventory = await Inventory.findOne({ accountOwnerId: req.query.accountId }); + if (inventory) { + // Set GuildId + inventory.GuildId = guild._id; + + // Give clan key + inventory.LevelKeys ??= []; + inventory.LevelKeys.push({ + ItemType: "/Lotus/Types/Keys/DojoKey", + ItemCount: 1 + }); + + await inventory.save(); + } + + res.json(guild); +}; + +export { createGuildController }; diff --git a/src/controllers/api/getGuildController.ts b/src/controllers/api/getGuildController.ts index 99cfb3f0..81dfde24 100644 --- a/src/controllers/api/getGuildController.ts +++ b/src/controllers/api/getGuildController.ts @@ -1,6 +1,24 @@ import { RequestHandler } from "express"; +import { Inventory } from "@/src/models/inventoryModels/inventoryModel"; +import { Guild } from "@/src/models/guildModel"; -const getGuildController: RequestHandler = (_req, res) => { +const getGuildController: RequestHandler = async (req, res) => { + if (!req.query.accountId) { + res.status(400).json({ error: "accountId was not provided" }); + return; + } + const inventory = await Inventory.findOne({ accountOwnerId: req.query.accountId }); + if (!inventory) { + res.status(400).json({ error: "inventory was undefined" }); + return; + } + if (inventory.GuildId) { + const guild = await Guild.findOne({ _id: inventory.GuildId }); + if (guild) { + res.json(guild); + return; + } + } res.json({}); }; diff --git a/src/models/guildModel.ts b/src/models/guildModel.ts new file mode 100644 index 00000000..3d8cbc3b --- /dev/null +++ b/src/models/guildModel.ts @@ -0,0 +1,16 @@ +import { IGuild, IDatabaseGuild } from "@/src/types/guildTypes"; +import { model, Schema } from "mongoose"; +import { toOid } from "@/src/helpers/inventoryHelpers"; + +const guildSchema = new Schema({ + Name: { type: String, required: true } +}); + +guildSchema.set("toJSON", { + virtuals: true, + transform(_document, guild) { + guild._id = toOid(guild._id); + } +}); + +export const Guild = model("Guild", guildSchema); diff --git a/src/models/inventoryModels/inventoryModel.ts b/src/models/inventoryModels/inventoryModel.ts index d7f3ae81..547c56aa 100644 --- a/src/models/inventoryModels/inventoryModel.ts +++ b/src/models/inventoryModels/inventoryModel.ts @@ -874,6 +874,9 @@ const inventorySchema = new Schema( //You first Dialog with NPC or use new Item NodeIntrosCompleted: [String], + //Current guild id, if applicable. + GuildId: { type: Schema.Types.ObjectId, ref: "Guild" }, + //https://warframe.fandom.com/wiki/Heist //ProfitTaker(1-4) Example:"LocationTag": "EudicoHeists", "Jobs":Mission name CompletedJobChains: [completedJobChainsSchema], @@ -971,6 +974,9 @@ inventorySchema.set("toJSON", { inventoryResponse.TrainingDate = toMongoDate(inventoryDatabase.TrainingDate); inventoryResponse.Created = toMongoDate(inventoryDatabase.Created); + if (inventoryDatabase.GuildId) { + inventoryResponse.GuildId = toOid(inventoryDatabase.GuildId); + } if (inventoryResponse.BlessingCooldown) { inventoryResponse.BlessingCooldown = toMongoDate(inventoryDatabase.BlessingCooldown); } diff --git a/src/routes/api.ts b/src/routes/api.ts index 537e245e..3f68a958 100644 --- a/src/routes/api.ts +++ b/src/routes/api.ts @@ -43,6 +43,7 @@ import { setActiveShipController } from "@/src/controllers/api/setActiveShipCont import { updateThemeController } from "../controllers/api/updateThemeController"; import { getGuildController } from "@/src/controllers/api/getGuildController"; import { addFriendImageController } from "@/src/controllers/api/addFriendImageController"; +import { createGuildController } from "@/src/controllers/api/createGuildController"; const apiRouter = express.Router(); @@ -96,5 +97,6 @@ apiRouter.post("/saveLoadout.php", saveLoadoutController); apiRouter.post("/trainingResult.php", trainingResultController); apiRouter.post("/updateTheme.php", updateThemeController); apiRouter.post("/addFriendImage.php", addFriendImageController); +apiRouter.post("/createGuild.php", createGuildController); export { apiRouter }; diff --git a/src/types/guildTypes.ts b/src/types/guildTypes.ts new file mode 100644 index 00000000..30350ff4 --- /dev/null +++ b/src/types/guildTypes.ts @@ -0,0 +1,18 @@ +import { Types } from "mongoose"; +import { IOid } from "@/src/types/commonTypes"; + +export interface IGuild { + Name: string; +} + +export interface IDatabaseGuild extends IGuild { + _id: Types.ObjectId; +} + +export interface IGuildResponse extends IGuild { + _id: IOid; +} + +export interface ICreateGuildRequest { + guildName: string; +} diff --git a/src/types/inventoryTypes/inventoryTypes.ts b/src/types/inventoryTypes/inventoryTypes.ts index 71f5ebac..0bec69da 100644 --- a/src/types/inventoryTypes/inventoryTypes.ts +++ b/src/types/inventoryTypes/inventoryTypes.ts @@ -21,6 +21,7 @@ export interface IInventoryDatabase | "TrainingDate" | "LoadOutPresets" | "Mailbox" + | "GuildId" | "PendingRecipes" | "Created" | "QuestKeys" @@ -32,6 +33,7 @@ export interface IInventoryDatabase TrainingDate: Date; // TrainingDate changed from IMongoDate to Date LoadOutPresets: Types.ObjectId; // LoadOutPresets changed from ILoadOutPresets to Types.ObjectId for population Mailbox: Types.ObjectId; // Mailbox changed from IMailbox to Types.ObjectId + GuildId?: Types.ObjectId; // GuildId changed from ?IOid to ?Types.ObjectId PendingRecipes: IPendingRecipe[]; QuestKeys: IQuestKeyDatabase[]; BlessingCooldown: Date; @@ -232,6 +234,7 @@ export interface IInventoryResponse { RecentVendorPurchases: Array; Hoverboards: IHoverboard[]; NodeIntrosCompleted: string[]; + GuildId?: IOid; CompletedJobChains: ICompletedJobChain[]; SeasonChallengeHistory: ISeasonChallengeHistory[]; MoaPets: IMoaPet[];