diff --git a/imports/api/collections/Players.js b/imports/api/collections/Players.js
index 3d306ec..e429750 100644
--- a/imports/api/collections/Players.js
+++ b/imports/api/collections/Players.js
@@ -2,7 +2,7 @@ import { Mongo } from "meteor/mongo";
let Players = new Mongo.Collection("players");
-// let collection = Players.rawCollection();
-// collection.ensureIndex({ joinCode: 1 }, { unique: true });
+let collection = Players.rawCollection();
+collection.ensureIndex({ name: 1, roomId: 1, }, { unique: true });
export default Players;
diff --git a/imports/api/methods/index.js b/imports/api/methods/index.js
index 7636156..283b2b5 100644
--- a/imports/api/methods/index.js
+++ b/imports/api/methods/index.js
@@ -1 +1,2 @@
import "./newGame";
+import "./joinGame";
diff --git a/imports/api/methods/joinGame.js b/imports/api/methods/joinGame.js
new file mode 100644
index 0000000..46f3fe2
--- /dev/null
+++ b/imports/api/methods/joinGame.js
@@ -0,0 +1,38 @@
+import { Meteor } from "meteor/meteor";
+import { Random } from "meteor/random";
+import { check } from "meteor/check";
+import Rooms from "../collections/Rooms.js";
+import Players from "../collections/Players.js";
+
+Meteor.methods({
+ "joinGame": async ({ code, name }) => {
+ check(code, String);
+ check(name, String);
+ name = name.trim();
+
+ let room = Rooms.findOne({ joinCode: code });
+ if (room === undefined) {
+ throw new Meteor.Error("room-not-found");
+ }
+
+ if (room.state !== "waitingRoom") {
+ throw new Meteor.Error("room-already-playing");
+ }
+
+ let roomId = room._id;
+ try {
+ let playerId = Players.insert({ roomId, name });
+ } catch (e) {
+ if (e.code === 11000) {
+ throw new Meteor.Error("name-collision");
+ }
+ }
+
+ let joinCode = room.joinCode;
+ let players = {};
+ Players.find({ roomId }).forEach((doc) => {
+ players[doc._id] = doc.name;
+ });
+ return { joinCode, players, roomId };
+ }
+});
diff --git a/imports/api/methods/newGame.js b/imports/api/methods/newGame.js
index da5f9f0..e030acc 100644
--- a/imports/api/methods/newGame.js
+++ b/imports/api/methods/newGame.js
@@ -7,6 +7,8 @@ import Players from "../collections/Players.js";
Meteor.methods({
"newGame": async ({ name }) => {
check(name, String);
+ name = name.trim();
+
let roomId = null;
let state = "waitingRoom";
@@ -25,16 +27,21 @@ Meteor.methods({
// BulkWriteError
if (e.code === 11000) {
remainingAttempts -= 1;
+ } else {
+ console.log("UNCAUGHT", e);
}
}
}
let playerId = Players.insert({ roomId, name });
+ Rooms.update(roomId, { $set: { owner: playerId } });
if (remainingAttempts == 0 && roomId === null) {
- return "failed";
+ throw new Meteor.Error("no-more-rooms");
}
- return { playerId, roomId, joinCode };
+ let players = {};
+ players[playerId] = name;
+ return { players, roomId, joinCode };
},
});
diff --git a/imports/ui/App.vue b/imports/ui/App.vue
index 16617e5..eb9a81e 100644
--- a/imports/ui/App.vue
+++ b/imports/ui/App.vue
@@ -1,15 +1,22 @@
or
-Join code: {{ joinCode.toUpperCase() }}
+Players: {{ players }}
+