Skip to content

Commit

Permalink
Release/0.0.20 (#58)
Browse files Browse the repository at this point in the history
* fix: upgrade @aws-sdk/client-s3 from 3.429.0 to 3.433.0 (#52)
* fix: upgrade mongoose from 7.6.3 to 7.6.4 (#53)
* feat: add angle to scene

---------

Co-authored-by: micahg <[email protected]>
Co-authored-by: snyk-bot <[email protected]>
  • Loading branch information
3 people authored Dec 11, 2023
1 parent e18683d commit 2479737
Show file tree
Hide file tree
Showing 12 changed files with 589 additions and 514 deletions.
1 change: 0 additions & 1 deletion .github/workflows/package.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,6 @@ jobs:
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
version:
needs: [publish, package]
runs-on: ubuntu-latest
permissions:
contents: write
Expand Down
16 changes: 15 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -82,4 +82,18 @@ GAME {

Follow a pathing structure like `/ENVIRONMENT/USER/GAME/SCENE` then quota enforement should be easyier as we can just roll up. S3 offers free storage for a year so maybe see if we can work that out!

Looks like presigned URLs might be what we need...
Looks like presigned URLs might be what we need...

## Dump DB

To export, call:

```
mongodump mongodb://localhost:27017/ntt --gzip --archive ntt.gz
```

To import after `db.dropDatabase()`, call:

```
mongorestore mongodb://localhost:27017/ntt --gzip --archive ntt.gz
```
986 changes: 493 additions & 493 deletions package-lock.json

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@micahg/nttsrv",
"version": "0.0.19",
"version": "0.0.20",
"description": "Network Tabletop Server",
"main": "server.js",
"files": [],
Expand Down Expand Up @@ -50,12 +50,12 @@
"websocket": "^1.0.34"
},
"dependencies": {
"@aws-sdk/client-s3": "^3.429.0",
"@aws-sdk/client-s3": "^3.433.0",
"body-parser": "^1.20.2",
"express": "^4.18.2",
"express-oauth2-jwt-bearer": "^1.6.0",
"jsonwebtoken": "^9.0.2",
"mongoose": "^7.6.3",
"mongoose": "^7.6.4",
"multer": "^1.4.5-lts.1",
"winston": "^3.11.0",
"ws": "^8.13.0"
Expand Down
20 changes: 11 additions & 9 deletions src/models/scene.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ interface IScene {
playerContentRev?: number;
viewport?: Rect;
backgroundSize?: Rect;
angle?: number;
}

const SceneSchema = new Schema<IScene>({
Expand All @@ -29,22 +30,23 @@ const SceneSchema = new Schema<IScene>({
detailContentRev: { type: Number, required: false },
playerContent: { type: String, required: false },
playerContentRev: { type: Number, required: false },
viewport: { type: {
angle: { type: Number, required: false },
viewport: { type: {
x: Number,
y: Number,
width: Number,
height: Number,
},
required: false
},
backgroundSize: { type: {
x: Number,
y: Number,
width: Number,
height: Number,
},
required: false
}
backgroundSize: { type: {
x: Number,
y: Number,
width: Number,
height: Number,
},
required: false
}
}, {timestamps: true});

const Scene = model<IScene>('Scene', SceneSchema);
Expand Down
12 changes: 10 additions & 2 deletions src/routes/scene.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { createUserScene, deleteUserScene, getOrCreateScenes, getSceneById, setS
import { OBJECT_ID_LEN, VALID_LAYERS } from "../utils/constants";
import { IScene } from "../models/scene";
import { LayerUpdate, updateAssetFromLink, updateAssetFromUpload } from "../utils/localstore";
import { validateViewPort } from "../utils/viewport";
import { validateAngle, validateViewPort } from "../utils/viewport";
import { Rect } from "../utils/tablestate";

const NAME_REGEX = /^[\w\s]{1,64}$/;
Expand Down Expand Up @@ -104,16 +104,24 @@ export function updateSceneViewport(req: Request, res: Response, next: any) {

const vp: Rect = req.body.viewport;
const bg: Rect = req.body.backgroundSize;
const angle: number = req.body.angle;

if ((angle === undefined || angle === null) && !bg && !vp)
throw new Error(`Nothing to do`, {cause: 400});

if (vp && !validateViewPort(vp))
throw new Error(`Invalid height in set viewport body`, {cause: 400});

if (bg && !validateViewPort(bg))
throw new Error(`Invalid background rect in set viewport body`, {cause: 400});

if (angle && !validateAngle(angle))
throw new Error(`Invalid angle in set viewport body`, {cause: 400});

return getUser(req.auth)
.then(user => userExistsOr401(user))
.then(user => getSceneById(req.params.id, user._id.toString()))
.then(scene => setSceneViewport(scene._id.toString(), bg, vp))
.then(scene => setSceneViewport(scene._id.toString(), bg, vp, angle))
.then(scene => res.json(scene))
.catch(err => next(err));
}
3 changes: 1 addition & 2 deletions src/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ export const shutDown = (reason: string) => {
}

// defer listening for requests until we receive an event to check for startup conditions
// events are emitted when a precondition is satisfied (eg: connecton to the db)
// events are emitted when a precondition is satisfied (eg: connection to the db)
// ts-prune-ignore-next used in unit test
export const serverPromise = new Promise<Server>(resolve => {
app.on(STARTUP_CHECK_SIG, () => {
Expand All @@ -63,7 +63,6 @@ export const serverPromise = new Promise<Server>(resolve => {
log.info('All startup flags set');

// presumably the dir was created and we don't need to check for it.
// let srvr: Server = expressConfig.listen(app);
srvr = expressConfig.listen(app);
getOAuthPublicKey().then(pem => {
log.info('Retrieved OAuth PEM');
Expand Down
4 changes: 2 additions & 2 deletions src/utils/scene.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,6 @@ export function getOrCreateScenes(user: IUser): Promise<IScene[]> {
});
}

export function setSceneViewport(id: string, bg?: Rect, vp?: Rect) {
return Scene.findOneAndUpdate({_id: id}, {backgroundSize: bg, viewport: vp}, {new: true});
export function setSceneViewport(id: string, bg?: Rect, vp?: Rect, angle?: number) {
return Scene.findOneAndUpdate({_id: id}, {backgroundSize: bg, viewport: vp, angle: angle}, {new: true});
}
3 changes: 2 additions & 1 deletion src/utils/tablestate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ export interface Rect {
y: number,
width: number,
height: number,
};
}

/**
* Table state. In the future this should be in mongo if we need persistance
Expand All @@ -13,5 +13,6 @@ export interface TableState {
overlay?: string;
background?: string;
viewport: Rect;
angle: number;
backgroundSize?: Rect;
}
6 changes: 6 additions & 0 deletions src/utils/viewport.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,10 @@ export function validateViewPort(viewport: Rect): boolean {
if (viewport.width === null || viewport.width === undefined) return false;
if (viewport.height === null || viewport.height === undefined) return false;
return true;
}

export function validateAngle(angle: unknown): boolean {
if (typeof angle !== 'number') return false;
if (angle < 0 || angle >= 360) return false;
return true;
}
2 changes: 2 additions & 0 deletions src/utils/websocket.ts
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ function verifyConnection(sock: WebSocket, req: IncomingMessage) {
background: scene.playerContent,
viewport: scene.viewport,
backgroundSize: scene.backgroundSize,
angle: scene.angle || 0,
};
const msg: WSStateMessage = {
'method': 'connection',
Expand Down Expand Up @@ -118,6 +119,7 @@ export function startWSServer(nodeServer: Server, app: Express, pem: string): We
background: update.playerContent,
viewport: update.viewport,
backgroundSize: update.backgroundSize,
angle: update.angle || 0,
}
const sock: WebSocket = SOCKET_SESSIONS.get(userID);
const msg: WSStateMessage = {
Expand Down
44 changes: 44 additions & 0 deletions test/scene.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -166,4 +166,48 @@ describe("scene", () => {
expect(resp.body.backgroundSize.width).toBe(1);
});

it("Should update the angle", async () => {
const resp = await request(app)
.put(`/scene/${u0DefScene._id}/viewport`)
.send({
angle: 90,
});
expect(resp.statusCode).toBe(200);
expect(resp.body.angle).toBe(90);
});

it("Should handle an empty payload", async () => {
const resp = await request(app)
.put(`/scene/${u0DefScene._id}/viewport`)
.send({});
expect(resp.statusCode).toBe(400);
});

it("Should handle bad viewport", async () => {
const resp = await request(app)
.put(`/scene/${u0DefScene._id}/viewport`)
.send({
viewport: 'notAVP',
});
expect(resp.statusCode).toBe(400);
});

it("Should handle bad background", async () => {
const resp = await request(app)
.put(`/scene/${u0DefScene._id}/viewport`)
.send({
backgroundSize: 'notABG',
});
expect(resp.statusCode).toBe(400);
});

it("Should handle bad angle", async () => {
const resp = await request(app)
.put(`/scene/${u0DefScene._id}/viewport`)
.send({
angle: 'noAngle',
});
expect(resp.statusCode).toBe(400);
});

});

0 comments on commit 2479737

Please sign in to comment.