返回提交历史
Modified
src/controllers/api/contributeToDojoComponentController.ts
+61
-40
Added
src/controllers/api/contributeToVaultController.ts
+49
-0
Modified
src/controllers/api/dojoComponentRushController.ts
+2
-0
Modified
src/controllers/api/getGuildController.ts
+3
-1
Modified
src/controllers/api/guildTechController.ts
+28
-2
Modified
src/models/guildModel.ts
+9
-2
Modified
src/models/inventoryModels/inventoryModel.ts
+1
-1
Modified
src/routes/api.ts
+2
-0
Modified
src/services/guildService.ts
+53
-8
Modified
src/types/guildTypes.ts
+30
-8
XFEstudio/XFESpaceNinjaServer
feat: clan vault (#1093)
Closes #1080 Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/1093
57b3a5b9
代码差异
10 个文件
+238
-62
@@ -13,12 +13,9 @@ interface IContributeToDojoComponentRequest {
13
13
ComponentId: string;
14
14
DecoId?: string;
15
15
DecoType?: string;
16
IngredientContributions: {
17
ItemType: string;
18
ItemCount: number;
19
}[];
16
IngredientContributions: IMiscItem[];
20
17
RegularCredits: number;
21
VaultIngredientContributions: [];
18
VaultIngredientContributions: IMiscItem[];
22
19
VaultCredits: number;
23
20
}
24
21
@@ -37,13 +34,13 @@ export const contributeToDojoComponentController: RequestHandler = async (req, r
37
34
throw new Error("attempt to contribute to a deco in an unfinished room?!");
38
35
}
39
36
const meta = Object.values(ExportDojoRecipes.rooms).find(x => x.resultType == component.pf)!;
40
await processContribution(guild, request, inventory, inventoryChanges, meta, component);
37
processContribution(guild, request, inventory, inventoryChanges, meta, component);
41
38
} else {
42
39
// Room is past "Collecting Materials"
43
40
if (request.DecoId) {
44
41
const deco = component.Decos!.find(x => x._id.equals(request.DecoId))!;
45
42
const meta = Object.values(ExportDojoRecipes.decos).find(x => x.resultType == deco.Type)!;
46
await processContribution(guild, request, inventory, inventoryChanges, meta, deco);
43
processContribution(guild, request, inventory, inventoryChanges, meta, deco);
47
44
}
48
45
}
49
46
@@ -55,46 +52,76 @@ export const contributeToDojoComponentController: RequestHandler = async (req, r
55
52
});
56
53
};
57
54
58
const processContribution = async (
55
const processContribution = (
59
56
guild: TGuildDatabaseDocument,
60
57
request: IContributeToDojoComponentRequest,
61
58
inventory: TInventoryDatabaseDocument,
62
59
inventoryChanges: IInventoryChanges,
63
60
meta: IDojoRecipe,
64
61
component: IDojoContributable
65
): Promise<void> => {
62
): void => {
66
63
component.RegularCredits ??= 0;
67
if (component.RegularCredits + request.RegularCredits > scaleRequiredCount(meta.price)) {
68
request.RegularCredits = scaleRequiredCount(meta.price) - component.RegularCredits;
64
if (request.RegularCredits) {
65
component.RegularCredits += request.RegularCredits;
66
inventoryChanges.RegularCredits = -request.RegularCredits;
67
updateCurrency(inventory, request.RegularCredits, false);
68
}
69
if (request.VaultCredits) {
70
component.RegularCredits += request.VaultCredits;
71
guild.VaultRegularCredits! -= request.VaultCredits;
72
}
73
if (component.RegularCredits > scaleRequiredCount(meta.price)) {
74
guild.VaultRegularCredits ??= 0;
75
guild.VaultRegularCredits += component.RegularCredits - scaleRequiredCount(meta.price);
76
component.RegularCredits = scaleRequiredCount(meta.price);
69
77
}
70
component.RegularCredits += request.RegularCredits;
71
inventoryChanges.RegularCredits = -request.RegularCredits;
72
updateCurrency(inventory, request.RegularCredits, false);
73
78
74
79
component.MiscItems ??= [];
75
const miscItemChanges: IMiscItem[] = [];
76
for (const ingredientContribution of request.IngredientContributions) {
77
const componentMiscItem = component.MiscItems.find(x => x.ItemType == ingredientContribution.ItemType);
78
if (componentMiscItem) {
79
const ingredientMeta = meta.ingredients.find(x => x.ItemType == ingredientContribution.ItemType)!;
80
if (
81
componentMiscItem.ItemCount + ingredientContribution.ItemCount >
82
scaleRequiredCount(ingredientMeta.ItemCount)
83
) {
84
ingredientContribution.ItemCount =
85
scaleRequiredCount(ingredientMeta.ItemCount) - componentMiscItem.ItemCount;
80
if (request.VaultIngredientContributions.length) {
81
for (const ingredientContribution of request.VaultIngredientContributions) {
82
const componentMiscItem = component.MiscItems.find(x => x.ItemType == ingredientContribution.ItemType);
83
if (componentMiscItem) {
84
const ingredientMeta = meta.ingredients.find(x => x.ItemType == ingredientContribution.ItemType)!;
85
if (
86
componentMiscItem.ItemCount + ingredientContribution.ItemCount >
87
scaleRequiredCount(ingredientMeta.ItemCount)
88
) {
89
ingredientContribution.ItemCount =
90
scaleRequiredCount(ingredientMeta.ItemCount) - componentMiscItem.ItemCount;
91
}
92
componentMiscItem.ItemCount += ingredientContribution.ItemCount;
93
} else {
94
component.MiscItems.push(ingredientContribution);
95
}
96
const vaultMiscItem = guild.VaultMiscItems!.find(x => x.ItemType == ingredientContribution.ItemType)!;
97
vaultMiscItem.ItemCount -= ingredientContribution.ItemCount;
98
}
99
}
100
if (request.IngredientContributions.length) {
101
const miscItemChanges: IMiscItem[] = [];
102
for (const ingredientContribution of request.IngredientContributions) {
103
const componentMiscItem = component.MiscItems.find(x => x.ItemType == ingredientContribution.ItemType);
104
if (componentMiscItem) {
105
const ingredientMeta = meta.ingredients.find(x => x.ItemType == ingredientContribution.ItemType)!;
106
if (
107
componentMiscItem.ItemCount + ingredientContribution.ItemCount >
108
scaleRequiredCount(ingredientMeta.ItemCount)
109
) {
110
ingredientContribution.ItemCount =
111
scaleRequiredCount(ingredientMeta.ItemCount) - componentMiscItem.ItemCount;
112
}
113
componentMiscItem.ItemCount += ingredientContribution.ItemCount;
114
} else {
115
component.MiscItems.push(ingredientContribution);
86
116
}
87
componentMiscItem.ItemCount += ingredientContribution.ItemCount;
88
} else {
89
component.MiscItems.push(ingredientContribution);
117
miscItemChanges.push({
118
ItemType: ingredientContribution.ItemType,
119
ItemCount: ingredientContribution.ItemCount * -1
120
});
90
121
}
91
miscItemChanges.push({
92
ItemType: ingredientContribution.ItemType,
93
ItemCount: ingredientContribution.ItemCount * -1
94
});
122
addMiscItems(inventory, miscItemChanges);
123
inventoryChanges.MiscItems = miscItemChanges;
95
124
}
96
addMiscItems(inventory, miscItemChanges);
97
inventoryChanges.MiscItems = miscItemChanges;
98
125
99
126
if (component.RegularCredits >= scaleRequiredCount(meta.price)) {
100
127
let fullyFunded = true;
@@ -106,12 +133,6 @@ const processContribution = async (
106
133
}
107
134
}
108
135
if (fullyFunded) {
109
if (request.IngredientContributions.length) {
110
// We've already updated subpaths of MiscItems, we need to allow MongoDB to save this before we remove MiscItems.
111
await guild.save();
112
}
113
component.RegularCredits = undefined;
114
component.MiscItems = undefined;
115
136
component.CompletionTime = new Date(Date.now() + meta.time * 1000);
116
137
}
117
138
}
@@ -0,0 +1,49 @@
1
import { getGuildForRequestEx } from "@/src/services/guildService";
2
import { addFusionTreasures, addMiscItems, addShipDecorations, getInventory } from "@/src/services/inventoryService";
3
import { getAccountIdForRequest } from "@/src/services/loginService";
4
import { IFusionTreasure, IMiscItem, ITypeCount } from "@/src/types/inventoryTypes/inventoryTypes";
5
import { RequestHandler } from "express";
6
7
export const contributeToVaultController: RequestHandler = async (req, res) => {
8
const accountId = await getAccountIdForRequest(req);
9
const inventory = await getInventory(accountId);
10
const guild = await getGuildForRequestEx(req, inventory);
11
const request = JSON.parse(String(req.body)) as IContributeToVaultRequest;
12
13
if (request.RegularCredits) {
14
guild.VaultRegularCredits ??= 0;
15
guild.VaultRegularCredits += request.RegularCredits;
16
}
17
if (request.MiscItems.length) {
18
guild.VaultMiscItems ??= [];
19
for (const item of request.MiscItems) {
20
guild.VaultMiscItems.push(item);
21
addMiscItems(inventory, [{ ...item, ItemCount: item.ItemCount * -1 }]);
22
}
23
}
24
if (request.ShipDecorations.length) {
25
guild.VaultShipDecorations ??= [];
26
for (const item of request.ShipDecorations) {
27
guild.VaultShipDecorations.push(item);
28
addShipDecorations(inventory, [{ ...item, ItemCount: item.ItemCount * -1 }]);
29
}
30
}
31
if (request.FusionTreasures.length) {
32
guild.VaultFusionTreasures ??= [];
33
for (const item of request.FusionTreasures) {
34
guild.VaultFusionTreasures.push(item);
35
addFusionTreasures(inventory, [{ ...item, ItemCount: item.ItemCount * -1 }]);
36
}
37
}
38
39
await guild.save();
40
await inventory.save();
41
res.end();
42
};
43
44
interface IContributeToVaultRequest {
45
RegularCredits: number;
46
MiscItems: IMiscItem[];
47
ShipDecorations: ITypeCount[];
48
FusionTreasures: IFusionTreasure[];
49
}
@@ -47,4 +47,6 @@ const processContribution = (component: IDojoContributable, meta: IDojoRecipe, p
47
47
component.CompletionTime = new Date(
48
48
component.CompletionTime!.getTime() - secondsPerPlatinum * platinumDonated * 1000
49
49
);
50
component.RushPlatinum ??= 0;
51
component.RushPlatinum += platinumDonated;
50
52
};
@@ -3,6 +3,7 @@ import { Inventory } from "@/src/models/inventoryModels/inventoryModel";
3
3
import { Guild } from "@/src/models/guildModel";
4
4
import { getAccountIdForRequest } from "@/src/services/loginService";
5
5
import { toOid } from "@/src/helpers/inventoryHelpers";
6
import { getGuildVault } from "@/src/services/guildService";
6
7
7
8
const getGuildController: RequestHandler = async (req, res) => {
8
9
const accountId = await getAccountIdForRequest(req);
@@ -62,7 +63,8 @@ const getGuildController: RequestHandler = async (req, res) => {
62
63
Permissions: 4096
63
64
}
64
65
],
65
Tier: 1
66
Tier: 1,
67
Vault: getGuildVault(guild)
66
68
});
67
69
return;
68
70
}
@@ -1,5 +1,5 @@
1
1
import { RequestHandler } from "express";
2
import { getGuildForRequestEx, scaleRequiredCount } from "@/src/services/guildService";
2
import { getGuildForRequestEx, getGuildVault, scaleRequiredCount } from "@/src/services/guildService";
3
3
import { ExportDojoRecipes, IDojoResearch } from "warframe-public-export-plus";
4
4
import { getAccountIdForRequest } from "@/src/services/loginService";
5
5
import { addMiscItems, addRecipes, getInventory, updateCurrency } from "@/src/services/inventoryService";
@@ -43,10 +43,35 @@ export const guildTechController: RequestHandler = async (req, res) => {
43
43
} else if (action == "Contribute") {
44
44
const contributions = data as IGuildTechContributeFields;
45
45
const techProject = guild.TechProjects!.find(x => x.ItemType == contributions.RecipeType)!;
46
47
if (contributions.VaultCredits) {
48
if (contributions.VaultCredits > techProject.ReqCredits) {
49
contributions.VaultCredits = techProject.ReqCredits;
50
}
51
techProject.ReqCredits -= contributions.VaultCredits;
52
guild.VaultRegularCredits! -= contributions.VaultCredits;
53
}
54
46
55
if (contributions.RegularCredits > techProject.ReqCredits) {
47
56
contributions.RegularCredits = techProject.ReqCredits;
48
57
}
49
58
techProject.ReqCredits -= contributions.RegularCredits;
59
60
if (contributions.VaultMiscItems.length) {
61
for (const miscItem of contributions.VaultMiscItems) {
62
const reqItem = techProject.ReqItems.find(x => x.ItemType == miscItem.ItemType);
63
if (reqItem) {
64
if (miscItem.ItemCount > reqItem.ItemCount) {
65
miscItem.ItemCount = reqItem.ItemCount;
66
}
67
reqItem.ItemCount -= miscItem.ItemCount;
68
69
const vaultMiscItem = guild.VaultMiscItems!.find(x => x.ItemType == miscItem.ItemType)!;
70
vaultMiscItem.ItemCount -= miscItem.ItemCount;
71
}
72
}
73
}
74
50
75
const miscItemChanges = [];
51
76
for (const miscItem of contributions.MiscItems) {
52
77
const reqItem = techProject.ReqItems.find(x => x.ItemType == miscItem.ItemType);
@@ -74,7 +99,8 @@ export const guildTechController: RequestHandler = async (req, res) => {
74
99
await guild.save();
75
100
await inventory.save();
76
101
res.json({
77
InventoryChanges: inventoryChanges
102
InventoryChanges: inventoryChanges,
103
Vault: getGuildVault(guild)
78
104
});
79
105
} else if (action == "Buy") {
80
106
const purchase = data as IGuildTechBuyFields;
@@ -6,7 +6,7 @@ import {
6
6
IDojoDecoDatabase
7
7
} from "@/src/types/guildTypes";
8
8
import { Document, Model, model, Schema, Types } from "mongoose";
9
import { typeCountSchema } from "./inventoryModels/inventoryModel";
9
import { fusionTreasuresSchema, typeCountSchema } from "./inventoryModels/inventoryModel";
10
10
import { toMongoDate } from "../helpers/inventoryHelpers";
11
11
12
12
const dojoDecoSchema = new Schema<IDojoDecoDatabase>({
@@ -16,7 +16,8 @@ const dojoDecoSchema = new Schema<IDojoDecoDatabase>({
16
16
Name: String,
17
17
RegularCredits: Number,
18
18
MiscItems: { type: [typeCountSchema], default: undefined },
19
CompletionTime: Date
19
CompletionTime: Date,
20
RushPlatinum: Number
20
21
});
21
22
22
23
const dojoComponentSchema = new Schema<IDojoComponentDatabase>({
@@ -30,6 +31,7 @@ const dojoComponentSchema = new Schema<IDojoComponentDatabase>({
30
31
RegularCredits: Number,
31
32
MiscItems: { type: [typeCountSchema], default: undefined },
32
33
CompletionTime: Date,
34
RushPlatinum: Number,
33
35
DestructionTime: Date,
34
36
Decos: [dojoDecoSchema],
35
37
DecoCapacity: Number
@@ -63,6 +65,11 @@ const guildSchema = new Schema<IGuildDatabase>(
63
65
DojoComponents: { type: [dojoComponentSchema], default: [] },
64
66
DojoCapacity: { type: Number, default: 100 },
65
67
DojoEnergy: { type: Number, default: 5 },
68
VaultRegularCredits: Number,
69
VaultPremiumCredits: Number,
70
VaultMiscItems: { type: [typeCountSchema], default: undefined },
71
VaultShipDecorations: { type: [typeCountSchema], default: undefined },
72
VaultFusionTreasures: { type: [fusionTreasuresSchema], default: undefined },
66
73
TechProjects: { type: [techProjectSchema], default: undefined }
67
74
},
68
75
{ id: false }
@@ -552,7 +552,7 @@ questKeysSchema.set("toJSON", {
552
552
}
553
553
});
554
554
555
const fusionTreasuresSchema = new Schema<IFusionTreasure>().add(typeCountSchema).add({ Sockets: Number });
555
export const fusionTreasuresSchema = new Schema<IFusionTreasure>().add(typeCountSchema).add({ Sockets: Number });
556
556
557
557
const spectreLoadoutsSchema = new Schema<ISpectreLoadout>(
558
558
{
@@ -14,6 +14,7 @@ import { claimLibraryDailyTaskRewardController } from "@/src/controllers/api/cla
14
14
import { clearDialogueHistoryController } from "@/src/controllers/api/clearDialogueHistoryController";
15
15
import { completeRandomModChallengeController } from "@/src/controllers/api/completeRandomModChallengeController";
16
16
import { contributeToDojoComponentController } from "@/src/controllers/api/contributeToDojoComponentController";
17
import { contributeToVaultController } from "@/src/controllers/api/contributeToVaultController";
17
18
import { createGuildController } from "@/src/controllers/api/createGuildController";
18
19
import { creditsController } from "@/src/controllers/api/creditsController";
19
20
import { deleteSessionController } from "@/src/controllers/api/deleteSessionController";
@@ -153,6 +154,7 @@ apiRouter.post("/claimCompletedRecipe.php", claimCompletedRecipeController);
153
154
apiRouter.post("/clearDialogueHistory.php", clearDialogueHistoryController);
154
155
apiRouter.post("/completeRandomModChallenge.php", completeRandomModChallengeController);
155
156
apiRouter.post("/contributeToDojoComponent.php", contributeToDojoComponentController);
157
apiRouter.post("/contributeToVault.php", contributeToVaultController);
156
158
apiRouter.post("/createGuild.php", createGuildController);
157
159
apiRouter.post("/destroyDojoDeco.php", destroyDojoDecoController);
158
160
apiRouter.post("/dojoComponentRush.php", dojoComponentRushController);
@@ -3,7 +3,13 @@ import { getAccountIdForRequest } from "@/src/services/loginService";
3
3
import { getInventory } from "@/src/services/inventoryService";
4
4
import { Guild, TGuildDatabaseDocument } from "@/src/models/guildModel";
5
5
import { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel";
6
import { IDojoClient, IDojoComponentClient } from "@/src/types/guildTypes";
6
import {
7
IDojoClient,
8
IDojoComponentClient,
9
IDojoContributable,
10
IDojoDecoClient,
11
IGuildVault
12
} from "@/src/types/guildTypes";
7
13
import { toMongoDate, toOid } from "@/src/helpers/inventoryHelpers";
8
14
import { Types } from "mongoose";
9
15
import { ExportDojoRecipes } from "warframe-public-export-plus";
@@ -30,6 +36,16 @@ export const getGuildForRequestEx = async (
30
36
return guild;
31
37
};
32
38
39
export const getGuildVault = (guild: TGuildDatabaseDocument): IGuildVault => {
40
return {
41
DojoRefundRegularCredits: guild.VaultRegularCredits,
42
DojoRefundMiscItems: guild.VaultMiscItems,
43
DojoRefundPremiumCredits: guild.VaultPremiumCredits,
44
ShipDecorations: guild.VaultShipDecorations,
45
FusionTreasures: guild.VaultFusionTreasures
46
};
47
};
48
33
49
export const getDojoClient = async (
34
50
guild: TGuildDatabaseDocument,
35
51
status: number,
@@ -41,6 +57,7 @@ export const getDojoClient = async (
41
57
Tier: 1,
42
58
FixedContributions: true,
43
59
DojoRevision: 1,
60
Vault: getGuildVault(guild),
44
61
RevisionTime: Math.round(Date.now() / 1000),
45
62
Energy: guild.DojoEnergy,
46
63
Capacity: guild.DojoCapacity,
@@ -79,15 +96,20 @@ export const getDojoClient = async (
79
96
if (dojoComponent.Decos) {
80
97
clientComponent.Decos = [];
81
98
for (const deco of dojoComponent.Decos) {
82
clientComponent.Decos.push({
99
const clientDeco: IDojoDecoClient = {
83
100
id: toOid(deco._id),
84
101
Type: deco.Type,
85
102
Pos: deco.Pos,
86
103
Rot: deco.Rot,
87
CompletionTime: deco.CompletionTime ? toMongoDate(deco.CompletionTime) : undefined,
88
RegularCredits: deco.RegularCredits,
89
MiscItems: deco.MiscItems
90
});
104
Name: deco.Name
105
};
106
if (deco.CompletionTime) {
107
clientDeco.CompletionTime = toMongoDate(deco.CompletionTime);
108
} else {
109
clientDeco.RegularCredits = deco.RegularCredits;
110
clientDeco.MiscItems = deco.MiscItems;
111
}
112
clientComponent.Decos.push(clientDeco);
91
113
}
92
114
}
93
115
dojo.DojoComponents.push(clientComponent);
@@ -118,7 +140,8 @@ export const removeDojoRoom = (guild: TGuildDatabaseDocument, componentId: Types
118
140
guild.DojoCapacity -= meta.capacity;
119
141
guild.DojoEnergy -= meta.energy;
120
142
}
121
// TODO: Add resources spent to the clan vault
143
moveResourcesToVault(guild, component);
144
component.Decos?.forEach(deco => moveResourcesToVault(guild, deco));
122
145
};
123
146
124
147
export const removeDojoDeco = (
@@ -135,5 +158,27 @@ export const removeDojoDeco = (
135
158
if (meta && meta.capacityCost) {
136
159
component.DecoCapacity! += meta.capacityCost;
137
160
}
138
// TODO: Add resources spent to the clan vault
161
moveResourcesToVault(guild, deco);
162
};
163
164
const moveResourcesToVault = (guild: TGuildDatabaseDocument, component: IDojoContributable): void => {
165
if (component.RegularCredits) {
166
guild.VaultRegularCredits ??= 0;
167
guild.VaultRegularCredits += component.RegularCredits;
168
}
169
if (component.MiscItems) {
170
guild.VaultMiscItems ??= [];
171
for (const componentMiscItem of component.MiscItems) {
172
const vaultMiscItem = guild.VaultMiscItems.find(x => x.ItemType == componentMiscItem.ItemType);
173
if (vaultMiscItem) {
174
vaultMiscItem.ItemCount += componentMiscItem.ItemCount;
175
} else {
176
guild.VaultMiscItems.push(componentMiscItem);
177
}
178
}
179
}
180
if (component.RushPlatinum) {
181
guild.VaultPremiumCredits ??= 0;
182
guild.VaultPremiumCredits += component.RushPlatinum;
183
}
139
184
};
@@ -1,6 +1,6 @@
1
1
import { Types } from "mongoose";
2
2
import { IOid, IMongoDate } from "@/src/types/commonTypes";
3
import { IMiscItem } from "@/src/types/inventoryTypes/inventoryTypes";
3
import { IFusionTreasure, IMiscItem, ITypeCount } from "@/src/types/inventoryTypes/inventoryTypes";
4
4
5
5
export interface IGuild {
6
6
Name: string;
@@ -11,19 +11,38 @@ export interface IGuildDatabase extends IGuild {
11
11
DojoComponents: IDojoComponentDatabase[];
12
12
DojoCapacity: number;
13
13
DojoEnergy: number;
14
VaultRegularCredits?: number;
15
VaultPremiumCredits?: number;
16
VaultMiscItems?: IMiscItem[];
17
VaultShipDecorations?: ITypeCount[];
18
VaultFusionTreasures?: IFusionTreasure[];
14
19
TechProjects?: ITechProjectDatabase[];
15
20
}
16
21
22
export interface IGuildVault {
23
DojoRefundRegularCredits?: number;
24
DojoRefundMiscItems?: IMiscItem[];
25
DojoRefundPremiumCredits?: number;
26
ShipDecorations?: ITypeCount[];
27
FusionTreasures?: IFusionTreasure[];
28
DecoRecipes?: ITypeCount[]; // Event Trophies
29
}
30
17
31
export interface IDojoClient {
18
32
_id: IOid; // ID of the guild
19
33
Name: string;
20
34
Tier: number;
21
35
FixedContributions: boolean;
22
36
DojoRevision: number;
37
AllianceId?: IOid;
38
Vault?: IGuildVault;
39
Class?: number; // Level
23
40
RevisionTime: number;
24
41
Energy: number;
25
42
Capacity: number;
26
43
DojoRequestStatus: number;
44
ContentURL?: string;
45
GuildEmblem?: boolean;
27
46
DojoComponents: IDojoComponentClient[];
28
47
}
29
48
@@ -46,7 +65,7 @@ export interface IDojoComponentClient {
46
65
}
47
66
48
67
export interface IDojoComponentDatabase
49
extends Omit<IDojoComponentClient, "id" | "pi" | "CompletionTime" | "RushPlatinum" | "DestructionTime" | "Decos"> {
68
extends Omit<IDojoComponentClient, "id" | "pi" | "CompletionTime" | "DestructionTime" | "Decos"> {
50
69
_id: Types.ObjectId;
51
70
pi?: Types.ObjectId;
52
71
CompletionTime?: Date;
@@ -63,6 +82,7 @@ export interface IDojoDecoClient {
63
82
RegularCredits?: number;
64
83
MiscItems?: IMiscItem[];
65
84
CompletionTime?: IMongoDate;
85
RushPlatinum?: number;
66
86
}
67
87
68
88
export interface IDojoDecoDatabase extends Omit<IDojoDecoClient, "id" | "CompletionTime"> {
@@ -70,6 +90,14 @@ export interface IDojoDecoDatabase extends Omit<IDojoDecoClient, "id" | "Complet
70
90
CompletionTime?: Date;
71
91
}
72
92
93
// A common subset of the database representation of rooms & decos.
94
export interface IDojoContributable {
95
RegularCredits?: number;
96
MiscItems?: IMiscItem[];
97
CompletionTime?: Date;
98
RushPlatinum?: number;
99
}
100
73
101
export interface ITechProjectClient {
74
102
ItemType: string;
75
103
ReqCredits: number;
@@ -81,9 +109,3 @@ export interface ITechProjectClient {
81
109
export interface ITechProjectDatabase extends Omit<ITechProjectClient, "CompletionDate"> {
82
110
CompletionDate?: Date;
83
111
}
84
85
export interface IDojoContributable {
86
RegularCredits?: number;
87
MiscItems?: IMiscItem[];
88
CompletionTime?: Date;
89
}