Skip to content

Commit 544a2ae

Browse files
authored
fix: support bedrock uuids (#1687)
fixes #1673
1 parent 3181934 commit 544a2ae

5 files changed

Lines changed: 45 additions & 4 deletions

File tree

pages/player/[id]/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import PlayerActions from '../../../components/player/PlayerActions'
2020
import PlayerLastSeen from '../../../components/player/PlayerLastSeen'
2121

2222
export async function getServerSideProps ({ req, params }) {
23-
const { isUUID } = require('validator')
23+
const { isUUID } = require('../../../server/data/uuid')
2424

2525
if (!isUUID(params.id)) return { notFound: true }
2626

server/data/uuid.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
const { isUUID: validatorIsUUID } = require('validator')
2+
3+
// Wrapper around validator's isUUID with 'loose' mode to support Bedrock/Floodgate UUIDs
4+
// Standard isUUID rejects non-RFC 4122 compliant UUIDs (version/variant bits)
5+
// Bedrock UUIDs typically have format: 00000000-0000-0000-XXXX-XXXXXXXXXXXX
6+
const isUUID = (str) => validatorIsUUID(str, 'loose')
7+
8+
module.exports = { isUUID }

server/graphql/resolvers/scalars/uuid.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
const { parse, unparse } = require('uuid-parse')
22
const { GraphQLScalarType } = require('graphql')
33
const { Kind } = require('graphql/language')
4-
const { isUUID } = require('validator')
54
const ExposedErrpr = require('../../../data/exposed-error')
5+
const { isUUID } = require('../../../data/uuid')
66

77
module.exports = new GraphQLScalarType(
88
{

server/routes/opengraph/player.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
const { isUUID } = require('validator')
21
const { parse } = require('uuid-parse')
2+
const { isUUID } = require('../../data/uuid')
33
const path = require('path')
44
const sharp = require('sharp')
55
const send = require('koa-send')

server/test/player.query.test.js

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
const assert = require('assert')
2-
const { unparse } = require('uuid-parse')
2+
const { parse, unparse } = require('uuid-parse')
33
const supertest = require('supertest')
44
const createApp = require('../app')
55
const { createSetup } = require('./lib')
@@ -49,4 +49,37 @@ describe('Query player', () => {
4949
assert.strictEqual(body.data.player.name, player.name)
5050
assert.strictEqual(body.data.player.lastSeen, player.lastSeen)
5151
})
52+
53+
test('should resolve Bedrock/Floodgate UUID format', async () => {
54+
const { pool } = setup.serversPool.values().next().value
55+
56+
const bedrockUUID = '00000000-0000-0000-0009-01f4bf5b7415'
57+
const player = createPlayer({
58+
id: parse(bedrockUUID, Buffer.alloc(16))
59+
})
60+
61+
await pool('bm_players').insert(player)
62+
63+
const { body, statusCode } = await request
64+
.post('/graphql')
65+
.set('Accept', 'application/json')
66+
.send({
67+
query: `query players {
68+
player(player:"${bedrockUUID}") {
69+
id
70+
name
71+
lastSeen
72+
}
73+
}`
74+
})
75+
76+
assert.strictEqual(statusCode, 200)
77+
78+
assert(body)
79+
assert(body.data)
80+
81+
assert.strictEqual(body.data.player.id, bedrockUUID)
82+
assert.strictEqual(body.data.player.name, player.name)
83+
assert.strictEqual(body.data.player.lastSeen, player.lastSeen)
84+
})
5285
})

0 commit comments

Comments
 (0)