forked from OpenWF/SpaceNinjaServer
		
	feat: Clan creation & persistence (#146)
This commit is contained in:
		
							parent
							
								
									3acd8e9f74
								
							
						
					
					
						commit
						d07e99f0c9
					
				
							
								
								
									
										35
									
								
								src/controllers/api/createGuildController.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								src/controllers/api/createGuildController.ts
									
									
									
									
									
										Normal file
									
								
							@ -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 };
 | 
			
		||||
@ -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({});
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										16
									
								
								src/models/guildModel.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								src/models/guildModel.ts
									
									
									
									
									
										Normal file
									
								
							@ -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<IGuild>({
 | 
			
		||||
    Name: { type: String, required: true }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
guildSchema.set("toJSON", {
 | 
			
		||||
    virtuals: true,
 | 
			
		||||
    transform(_document, guild) {
 | 
			
		||||
        guild._id = toOid(guild._id);
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
export const Guild = model<IGuild>("Guild", guildSchema);
 | 
			
		||||
@ -874,6 +874,9 @@ const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>(
 | 
			
		||||
        //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);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@ -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 };
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										18
									
								
								src/types/guildTypes.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								src/types/guildTypes.ts
									
									
									
									
									
										Normal file
									
								
							@ -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;
 | 
			
		||||
}
 | 
			
		||||
@ -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<number | string>;
 | 
			
		||||
    Hoverboards: IHoverboard[];
 | 
			
		||||
    NodeIntrosCompleted: string[];
 | 
			
		||||
    GuildId?: IOid;
 | 
			
		||||
    CompletedJobChains: ICompletedJobChain[];
 | 
			
		||||
    SeasonChallengeHistory: ISeasonChallengeHistory[];
 | 
			
		||||
    MoaPets: IMoaPet[];
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user