返回提交历史
Modified
src/controllers/api/getShipController.ts
+10
-18
Added
src/controllers/dynamic/getShipController.ts
+15
-0
Modified
src/models/personalRoomsModel.ts
+1
-1
Modified
src/routes/dynamic.ts
+2
-0
Modified
src/services/loadoutService.ts
+3
-2
Modified
src/services/personalRoomsService.ts
+32
-1
XFEstudio/XFESpaceNinjaServer
feat: getShip for visitors (#3581)
Closes #3580 Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/3581 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com>
62b9e85d
代码差异
6 个文件
+63
-22
@@ -1,9 +1,12 @@
1
1
import type { RequestHandler } from "express";
2
2
import { getAccountIdForRequest } from "../../services/loginService.ts";
3
import { createGarden, getPersonalRooms } from "../../services/personalRoomsService.ts";
4
import type { IGetShipResponse, IPersonalRoomsClient } from "../../types/personalRoomsTypes.ts";
5
import { getLoadout } from "../../services/loadoutService.ts";
6
import { toOid } from "../../helpers/inventoryHelpers.ts";
3
import {
4
createGarden,
5
getPersonalRooms,
6
getShip,
7
refreshContentUrlSignature
8
} from "../../services/personalRoomsService.ts";
9
import type { IGetShipResponse } from "../../types/personalRoomsTypes.ts";
7
10
8
11
export const getShipController: RequestHandler = async (req, res) => {
9
12
const accountId = await getAccountIdForRequest(req);
@@ -12,22 +15,11 @@ export const getShipController: RequestHandler = async (req, res) => {
12
15
// Setup gardening if it's missing. Maybe should be done as part of some quest completion in the future.
13
16
if (personalRoomsDb.Apartment.Gardening.Planters.length == 0) {
14
17
personalRoomsDb.Apartment.Gardening = createGarden();
15
await personalRoomsDb.save();
16
18
}
17
19
18
const personalRooms = personalRoomsDb.toJSON<IPersonalRoomsClient>();
19
const loadout = await getLoadout(accountId);
20
21
const getShipResponse: IGetShipResponse = {
22
ShipOwnerId: accountId,
23
LoadOutInventory: { LoadOutPresets: loadout.toJSON() },
24
Ship: {
25
...personalRooms.Ship,
26
ShipId: toOid(personalRoomsDb.activeShipId)
27
},
28
Apartment: personalRooms.Apartment,
29
TailorShop: personalRooms.TailorShop
30
};
20
refreshContentUrlSignature(personalRoomsDb);
21
await personalRoomsDb.save();
31
22
23
const getShipResponse: IGetShipResponse = await getShip(personalRoomsDb);
32
24
res.json(getShipResponse);
33
25
};
@@ -0,0 +1,15 @@
1
import type { RequestHandler } from "express";
2
import { getPersonalRooms, getShip } from "../../services/personalRoomsService.ts";
3
import type { IGetShipResponse } from "../../types/personalRoomsTypes.ts";
4
5
export const getShipController: RequestHandler = async (req, res) => {
6
const personalRoomsDb = await getPersonalRooms(req.query.shipOwnerId as string);
7
8
if (personalRoomsDb.Ship.ContentUrlSignature != (req.query.sig as string)) {
9
res.status(409).send("Paramater error"); // [sic]
10
return;
11
}
12
13
const getShipResponse: IGetShipResponse = await getShip(personalRoomsDb);
14
res.json(getShipResponse);
15
};
@@ -169,7 +169,7 @@ const orbiterSchema = new Schema<IOrbiterDatabase>(
169
169
FavouriteLoadoutId: Schema.Types.ObjectId,
170
170
Wallpaper: String,
171
171
Vignette: String,
172
ContentUrlSignature: { type: String, required: false },
172
ContentUrlSignature: String,
173
173
BootLocation: String
174
174
},
175
175
{ _id: false }
@@ -2,6 +2,7 @@ import express from "express";
2
2
import { aggregateSessionsController } from "../controllers/dynamic/aggregateSessionsController.ts";
3
3
import { getGuildAdsController } from "../controllers/dynamic/getGuildAdsController.ts";
4
4
import { getProfileViewingDataGetController } from "../controllers/dynamic/getProfileViewingDataController.ts";
5
import { getShipController } from "../controllers/dynamic/getShipController.ts";
5
6
import { worldStateController } from "../controllers/dynamic/worldStateController.ts";
6
7
7
8
const dynamicRouter = express.Router();
@@ -9,6 +10,7 @@ const dynamicRouter = express.Router();
9
10
dynamicRouter.get("/aggregateSessions.php", aggregateSessionsController);
10
11
dynamicRouter.get("/getGuildAds.php", getGuildAdsController);
11
12
dynamicRouter.get("/getProfileViewingData.php", getProfileViewingDataGetController);
13
dynamicRouter.get("/getShip.php", getShipController);
12
14
dynamicRouter.get("/worldState.php", worldStateController);
13
15
dynamicRouter.post("/worldState.php", worldStateController); // used by companion app
14
16
@@ -1,11 +1,12 @@
1
import type { Types } from "mongoose";
1
2
import type { TLoadoutDatabaseDocument } from "../models/inventoryModels/loadoutModel.ts";
2
3
import { Loadout } from "../models/inventoryModels/loadoutModel.ts";
3
4
4
export const getLoadout = async (accountId: string): Promise<TLoadoutDatabaseDocument> => {
5
export const getLoadout = async (accountId: Types.ObjectId | string): Promise<TLoadoutDatabaseDocument> => {
5
6
const loadout = await Loadout.findOne({ loadoutOwnerId: accountId });
6
7
7
8
if (!loadout) {
8
throw new Error(`loadout not found for account ${accountId}`);
9
throw new Error(`loadout not found for account ${String(accountId)}`);
9
10
}
10
11
11
12
return loadout;
@@ -1,10 +1,17 @@
1
1
import { PersonalRooms } from "../models/personalRoomsModel.ts";
2
2
import { addItem } from "./inventoryService.ts";
3
import type { IGardeningDatabase, TPersonalRoomsDatabaseDocument } from "../types/personalRoomsTypes.ts";
3
import type {
4
IGardeningDatabase,
5
IGetShipResponse,
6
IPersonalRoomsClient,
7
TPersonalRoomsDatabaseDocument
8
} from "../types/personalRoomsTypes.ts";
4
9
import { getRandomElement } from "./rngService.ts";
5
10
import type { TInventoryDatabaseDocument } from "../models/inventoryModels/inventoryModel.ts";
6
11
import { logger } from "../utils/logger.ts";
7
12
import type { Types } from "mongoose";
13
import { getLoadout } from "./loadoutService.ts";
14
import { toOid } from "../helpers/inventoryHelpers.ts";
8
15
9
16
export const getPersonalRooms = async (
10
17
accountId: string | Types.ObjectId,
@@ -91,3 +98,27 @@ export const createGarden = (): IGardeningDatabase => {
91
98
]
92
99
};
93
100
};
101
102
export const refreshContentUrlSignature = (personalRooms: TPersonalRoomsDatabaseDocument): void => {
103
personalRooms.Ship.ContentUrlSignature = "";
104
for (let i = 0; i != 16; ++i) {
105
personalRooms.Ship.ContentUrlSignature += Math.floor(Math.random() * 256)
106
.toString(16)
107
.padStart(2, "0");
108
}
109
};
110
111
export const getShip = async (personalRoomsDb: TPersonalRoomsDatabaseDocument): Promise<IGetShipResponse> => {
112
const personalRooms = personalRoomsDb.toJSON<IPersonalRoomsClient>();
113
const loadout = await getLoadout(personalRoomsDb.personalRoomsOwnerId);
114
return {
115
ShipOwnerId: personalRoomsDb.personalRoomsOwnerId.toString(),
116
LoadOutInventory: { LoadOutPresets: loadout.toJSON() },
117
Ship: {
118
...personalRooms.Ship,
119
ShipId: toOid(personalRoomsDb.activeShipId)
120
},
121
Apartment: personalRooms.Apartment,
122
TailorShop: personalRooms.TailorShop
123
};
124
};