diff --git a/.meteor/packages b/.meteor/packages index 80470d0..8030272 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -6,24 +6,25 @@ meteor-base@1.5.1 # Packages every Meteor app needs to have mobile-experience@1.1.0 # Packages for a great mobile UX -mongo@1.13.0 # The database Meteor supports right now +mongo@1.14.6 # The database Meteor supports right now jquery # Wrapper package for npm-installed jquery reactive-var@1.0.11 # Reactive variable for tracker tracker@1.2.0 # Meteor's client-side reactive programming library standard-minifier-css@1.7.4 # CSS minifier run for production mode -standard-minifier-js@2.7.1 # JS minifier run for production mode +standard-minifier-js@2.8.0 # JS minifier run for production mode es5-shim@4.8.0 # ECMAScript 5 compatibility for older browsers -ecmascript@0.16.0 # Enable ECMAScript2015+ syntax in app code -typescript@4.4.0 # Enable TypeScript syntax in .ts and .tsx modules +ecmascript@0.16.1 # Enable ECMAScript2015+ syntax in app code +typescript@4.4.1 # Enable TypeScript syntax in .ts and .tsx modules shell-server@0.5.0 # Server-side component of the `meteor shell` command svelte:compiler rdb:svelte-meteor-data static-html@1.3.2 -accounts-ui@1.4.1 +accounts-ui@1.4.2 accounts-password@2.2.0 svelte:blaze-integration meteortesting:mocha accounts-google@1.4.0 service-configuration@1.3.0 +google-config-ui diff --git a/.meteor/release b/.meteor/release index 5599529..b1b0cce 100644 --- a/.meteor/release +++ b/.meteor/release @@ -1 +1 @@ -METEOR@2.5 +METEOR@2.6.1 diff --git a/.meteor/versions b/.meteor/versions index 00d3cc1..1aaaed5 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -1,12 +1,12 @@ -accounts-base@2.2.0 +accounts-base@2.2.1 accounts-google@1.4.0 accounts-oauth@1.4.0 accounts-password@2.2.0 -accounts-ui@1.4.1 +accounts-ui@1.4.2 accounts-ui-unstyled@1.6.0 -allow-deny@1.1.0 +allow-deny@1.1.1 autoupdate@1.8.0 -babel-compiler@7.7.0 +babel-compiler@7.8.1 babel-runtime@1.5.0 base64@1.0.12 binary-heap@1.0.11 @@ -24,7 +24,7 @@ ddp-rate-limiter@1.1.0 ddp-server@2.5.0 diff-sequence@1.1.1 dynamic-import@0.7.2 -ecmascript@0.16.0 +ecmascript@0.16.1 ecmascript-runtime@0.8.0 ecmascript-runtime-client@0.12.1 ecmascript-runtime-server@0.11.0 @@ -33,6 +33,7 @@ email@2.2.0 es5-shim@4.8.0 fetch@0.1.1 geojson-utils@1.0.10 +google-config-ui@1.0.3 google-oauth@1.4.1 hot-code-push@1.0.4 html-tools@1.1.2 @@ -47,31 +48,31 @@ localstorage@1.2.0 logging@1.3.1 meteor@1.10.0 meteor-base@1.5.1 -meteortesting:browser-tests@1.3.4 +meteortesting:browser-tests@1.3.5 meteortesting:mocha@2.0.3 meteortesting:mocha-core@8.1.2 minifier-css@1.6.0 -minifier-js@2.7.2 -minimongo@1.7.0 +minifier-js@2.7.3 +minimongo@1.8.0 mobile-experience@1.1.0 mobile-status-bar@1.1.0 modern-browsers@0.1.7 -modules@0.17.0 +modules@0.18.0 modules-runtime@0.12.0 -mongo@1.13.0 +mongo@1.14.6 mongo-decimal@0.1.2 mongo-dev-server@1.1.0 mongo-id@1.0.8 -npm-mongo@3.9.1 -oauth@2.1.0 +npm-mongo@4.3.1 +oauth@2.1.1 oauth2@1.3.1 observe-sequence@1.0.19 ordered-dict@1.1.0 promise@0.12.0 random@1.2.0 rate-limit@1.0.9 -rdb:svelte-meteor-data@0.3.0 -react-fast-refresh@0.2.0 +rdb:svelte-meteor-data@0.3.1 +react-fast-refresh@0.2.2 reactive-dict@1.3.0 reactive-var@1.0.11 reload@1.3.1 @@ -85,17 +86,17 @@ socket-stream-client@0.4.0 spacebars@1.2.0 spacebars-compiler@1.3.0 standard-minifier-css@1.7.4 -standard-minifier-js@2.7.2 +standard-minifier-js@2.8.0 static-html@1.3.2 svelte:blaze-integration@0.4.0 -svelte:compiler@3.31.2 +svelte:compiler@3.46.4 templating@1.4.1 templating-compiler@1.4.1 templating-runtime@1.5.0 templating-tools@1.2.1 tracker@1.2.0 -typescript@4.4.0 +typescript@4.4.1 underscore@1.0.10 url@1.3.2 -webapp@1.13.0 +webapp@1.13.1 webapp-hashing@1.1.0 diff --git a/client/main.html b/client/main.html index 9be3155..f6352db 100644 --- a/client/main.html +++ b/client/main.html @@ -1,5 +1,5 @@ - Todo List + District Central diff --git a/client/main.js b/client/main.js index 562ae5e..6d6aa4f 100644 --- a/client/main.js +++ b/client/main.js @@ -1,127 +1,9 @@ import {Meteor} from 'meteor/meteor'; import App from '../imports/ui/App.svelte'; import '../imports/startup/accounts-config.js'; -import Phaser from 'phaser'; Meteor.startup(() => { new App({ target: document.getElementById('app') }); - - - - - class playGame extends Phaser.Scene { - constructor() { - super("PlayGame"); - } - create() { - // graphic object used to draw walls - this.wallGraphics = this.add.graphics(); - this.wallGraphics.lineStyle(1, 0x00ff00); - - // graphic object used to draw rays of light - this.lightGraphics = this.add.graphics(); - - // array with all polygons in game - this.polygons = []; - - // add random boxes - for(let i = 0; i < gameOptions.boxes; i ++){ - this.addRandomBox(); - } - - // walls around game perimeter - this.polygons.push([[-1, -1], [game.config.width + 1, -1], [game.config.width + 1, game.config.height+1], [-1, game.config.height + 1]]); - - // listener for input movement - this.input.on("pointermove", this.renderLight, this); - } - addRandomBox() { - // use a do...while statement because there can't be intersecting polygons - do { - // random x and y coordinates, width and height - var startX = Phaser.Math.Between(10, game.config.width - 10 - gameOptions.sizeRange.max); - var startY = Phaser.Math.Between(10, game.config.height - 10 - gameOptions.sizeRange.max); - var width = Phaser.Math.Between(gameOptions.sizeRange.min, gameOptions.sizeRange.max); - var height = Phaser.Math.Between(gameOptions.sizeRange.min, gameOptions.sizeRange.max); - - // check if current box intersects other boxes - } while(this.boxesIntersect(startX, startY, width, height)); - - // draw the box - this.wallGraphics.strokeRect(startX, startY, width, height); - - // insert box vertices into polygons array - this.polygons.push([[startX, startY], [startX + width, startY], [startX + width, startY + height], [startX, startY + height]]); - } - // method to check if the box intersects other boxes - boxesIntersect(x, y, w, h) { - // loop through existing boxes - for(let i = 0; i < this.polygons.length; i ++) { - // if the box intersects the existing i-th box... - if(x < this.polygons[i][1][0] && x + w > this.polygons[i][0][0] && y < this.polygons[i][3][1] && y + h > this.polygons[i][0][1]){ - // return true - return true; - } - } - // if we reach the end of the loop, return false - return false; - } - // method to render the light - renderLight(pointer) { - // determine light polygon starting from pointer coordinates - let visibility = this.createLightPolygon(pointer.x, pointer.y); - - // clear and prepare lightGraphics graphic object - this.lightGraphics.clear(); - this.lightGraphics.lineStyle(2, 0xff8800); - this.lightGraphics.fillStyle(0xffff00); - - // begin a drawing path - this.lightGraphics.beginPath(); - - // move the graphic pen to first vertex of light polygon - this.lightGraphics.moveTo(visibility[0][0], visibility[0][1]); - - // loop through all light polygon vertices - for(let i = 1; i <= visibility.length; i ++) { - // draw a line to i-th light polygon vertex - this.lightGraphics.lineTo(visibility[i % visibility.length][0], visibility[ i %visibility.length][1]); - } - - // close, stroke and fill light polygon - this.lightGraphics.closePath(); - this.lightGraphics.fillPath(); - this.lightGraphics.strokePath(); - } - // method to create light polygon using visibility_polygon.js - createLightPolygon(x, y) { - let segments = VisibilityPolygon.convertToSegments(this.polygons); - segments = VisibilityPolygon.breakIntersections(segments); - let position = [x, y]; - if (VisibilityPolygon.inPolygon(position, this.polygons[this.polygons.length - 1])) { - return VisibilityPolygon.compute(position, segments); - } - return null; - } - } - - let config = { - type: Phaser.AUTO, - parent: "game", - width: "100%", - height: "100%", - physics: { - default: 'arcade', - arcade: { - gravity: {y: 200} - } - }, - scene: { - scene: playGame - } - }; - - let game = new Phaser.Game(config); -}); \ No newline at end of file +}); diff --git a/imports/api/index.js b/imports/api/index.js index 363b336..8b4e87e 100644 --- a/imports/api/index.js +++ b/imports/api/index.js @@ -1,2 +1,2 @@ -import "./tasks.js"; -import "./users.js"; \ No newline at end of file +import "./records.js"; +import "./users.js"; diff --git a/imports/api/records.js b/imports/api/records.js new file mode 100644 index 0000000..81b4608 --- /dev/null +++ b/imports/api/records.js @@ -0,0 +1,40 @@ +import { Meteor } from 'meteor/meteor'; +import { Mongo } from 'meteor/mongo'; +import { check } from 'meteor/check'; + +export const Records = new Mongo.Collection('records'); + +if (Meteor.isServer) { + // This code only runs on the server + Meteor.publish('records', function() { + return Records.find({}); + }); +} + +Meteor.methods({ + // 'tasks.setChecked'(taskId, setChecked) { + // check(taskId, String); + // check(setChecked, Boolean); + // + // const task = Tasks.findOne(taskId); + // if (task.private && task.owner !== this.userId) { + // // If the task is private, make sure only the owner can check it off + // throw new Meteor.Error('not-authorized'); + // } + // + // Tasks.update(taskId, { $set: { checked: setChecked } }); + // }, + // 'tasks.setPrivate'(taskId, setToPrivate) { + // check(taskId, String); + // check(setToPrivate, Boolean); + // + // const task = Tasks.findOne(taskId); + // + // // Make sure only the task owner can make a task private + // if (task.owner !== this.userId) { + // throw new Meteor.Error('not-authorized'); + // } + // + // Tasks.update(taskId, { $set: { private: setToPrivate } }); + // }, +}); diff --git a/imports/api/tasks.js b/imports/api/tasks.js deleted file mode 100644 index 1757738..0000000 --- a/imports/api/tasks.js +++ /dev/null @@ -1,71 +0,0 @@ -import { Meteor } from 'meteor/meteor'; -import { Mongo } from 'meteor/mongo'; -import { check } from 'meteor/check'; - -export const Tasks = new Mongo.Collection('tasks'); - -if (Meteor.isServer) { - // This code only runs on the server - Meteor.publish('tasks', function tasksPublication() { - return Tasks.find({ - $or: [ - { private: { $ne: true } }, - { owner: this.userId }, - ], - }); - }); -} - -Meteor.methods({ - 'tasks.insert'(text) { - check(text, String); - - // Make sure the user is logged in before inserting a task - if (!this.userId) { - throw new Meteor.Error('not-authorized'); - } - - Tasks.insert({ - text, - createdAt: new Date(), - owner: this.userId, - username: Meteor.users.findOne(this.userId).username, - }); - }, - 'tasks.remove'(taskId) { - check(taskId, String); - - const task = Tasks.findOne(taskId); - if (task.private && task.owner !== this.userId) { - // If the task is private, make sure only the owner can delete it - throw new Meteor.Error('not-authorized'); - } - - Tasks.remove(taskId); - }, - 'tasks.setChecked'(taskId, setChecked) { - check(taskId, String); - check(setChecked, Boolean); - - const task = Tasks.findOne(taskId); - if (task.private && task.owner !== this.userId) { - // If the task is private, make sure only the owner can check it off - throw new Meteor.Error('not-authorized'); - } - - Tasks.update(taskId, { $set: { checked: setChecked } }); - }, - 'tasks.setPrivate'(taskId, setToPrivate) { - check(taskId, String); - check(setToPrivate, Boolean); - - const task = Tasks.findOne(taskId); - - // Make sure only the task owner can make a task private - if (task.owner !== this.userId) { - throw new Meteor.Error('not-authorized'); - } - - Tasks.update(taskId, { $set: { private: setToPrivate } }); - }, -}); \ No newline at end of file diff --git a/imports/api/tasks.tests.js b/imports/api/tasks.tests.js deleted file mode 100644 index 8e668f2..0000000 --- a/imports/api/tasks.tests.js +++ /dev/null @@ -1,41 +0,0 @@ -/* eslint-env mocha */ - -import { Meteor } from 'meteor/meteor'; -import { Random } from 'meteor/random'; -import { assert } from 'chai'; - -import { Tasks } from './tasks.js'; - -if (Meteor.isServer) { - describe('Tasks', () => { - describe('methods', () => { - const userId = Random.id(); - let taskId; - - beforeEach(() => { - Tasks.remove({}); - taskId = Tasks.insert({ - text: 'test task', - createdAt: new Date(), - owner: userId, - username: 'tmeasday', - }); - }); - - it('can delete owned task', () => { - // Find the internal implementation of the task method so we can - // test it in isolation - const deleteTask = Meteor.server.method_handlers['tasks.remove']; - - // Set up a fake method invocation that looks like what the method expects - const invocation = { userId }; - - // Run the method with `this` set to the fake invocation - deleteTask.apply(invocation, [taskId]); - - // Verify that the method does what we expected - assert.equal(Tasks.find().count(), 0); - }); - }); - }); -} \ No newline at end of file diff --git a/imports/startup/accounts-config.js b/imports/startup/accounts-config.js index 7519a14..5afc879 100644 --- a/imports/startup/accounts-config.js +++ b/imports/startup/accounts-config.js @@ -1,5 +1,11 @@ -import { Accounts } from 'meteor/accounts-base'; +import { Accounts } from 'meteor/accounts-base' Accounts.ui.config({ passwordSignupFields: 'USERNAME_ONLY' -}); \ No newline at end of file +}); + +Accounts.config({ + restrictCreationByEmailDomain: function(address) { + return new RegExp('.*@avpanthers.org$', 'i').test(address) + } +}); diff --git a/imports/ui/App.svelte b/imports/ui/App.svelte index 7c422c1..30aee95 100644 --- a/imports/ui/App.svelte +++ b/imports/ui/App.svelte @@ -3,51 +3,41 @@ import {onMount} from 'svelte'; import {useTracker} from 'meteor/rdb:svelte-meteor-data'; import {BlazeTemplate} from 'meteor/svelte:blaze-integration'; - import Task from './Task.svelte'; - import {Tasks} from '../api/tasks.js' + import {Records} from '../api/records.js' + import ServiceConfiguration from "meteor/service-configuration"; - let newTask = ""; - let hideCompleted = false; - let tasks; let currentUser; onMount(async () => { - Meteor.subscribe('tasks'); + // Meteor.subscribe('records'); }); - $: incompleteCount = useTracker(() => Tasks.find({checked: {$ne: true}}).count()); + // $: incompleteCount = useTracker(() => Tasks.find({checked: {$ne: true}}).count()); $: currentUser = useTracker(() => Meteor.user()); - const taskStore = Tasks.find({}, {sort: {createdAt: -1}}); - $: { - tasks = $taskStore; - if (hideCompleted) { - tasks = tasks.filter(task => !task.checked); - } - } + // const taskStore = Tasks.find({}, {sort: {createdAt: -1}}); + // $: { + // tasks = $taskStore; + // if (hideCompleted) { + // tasks = tasks.filter(task => !task.checked); + // } + // } - function handleSubmit(event) { - Meteor.call("tasks.insert", newTask); - // Clear form - newTask = ""; - } + // function handleSubmit(event) { + // Meteor.call("tasks.insert", newTask); + // // Clear form + // newTask = ""; + // } function performLogin() { - //console.log("In Perform Login"); - //Meteor.call("users.login"); - let config = ServiceConfiguration.configurations.findOne({service: 'google'}); - - console.log(config); - let scope = config.scope; - let loginStyle = "popup"; - - Meteor.loginWithGoogle({requestPermissions: scope, loginStyle, requestOfflineToken: true}, (err) => { + //Login style can be "popup" or "redirect". I am not sure we need to request and offline token. + Meteor.loginWithGoogle({loginStyle: "popup", requestOfflineToken: true}, (err) => { if(err) { console.log(err); } else { - console.log("Logged in"); + //console.log("Logged in"); } }) } @@ -59,42 +49,39 @@
-

Todo List ({ $incompleteCount })

- + + + + + + + + - + {#if !$currentUser} {:else} {/if} - {#if $currentUser} -
- -
- {/if} + + + + + + + + +
-
- -
diff --git a/package-lock.json b/package-lock.json index 5d23809..3a928ae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,23 +6,26 @@ "": { "name": "DistrictCentral", "dependencies": { - "@babel/runtime": "^7.8.3", + "@babel/runtime": "^7.16.7", "connect-route": "^0.1.5", - "jquery": "^3.4.1", + "jquery": "^3.6.0", "meteor-node-stubs": "^1.0.0", - "phaser": "3.55.2", - "svelte": "^3.31.2" + "svelte": "^3.46.4", + "ws": "^8.4.2" }, "devDependencies": { "chai": "^4.2.0" } }, "node_modules/@babel/runtime": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", - "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz", + "integrity": "sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==", "dependencies": { "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/assertion-error": { @@ -80,11 +83,6 @@ "node": ">=0.12" } }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, "node_modules/get-func-name": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", @@ -94,15 +92,10 @@ "node": "*" } }, - "node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, "node_modules/jquery": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.4.1.tgz", - "integrity": "sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw==" + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", + "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" }, "node_modules/meteor-node-stubs": { "version": "1.0.0", @@ -788,50 +781,24 @@ "node": ">=0.4" } }, - "node_modules/path": { - "version": "0.12.7", - "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", - "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=", - "dependencies": { - "process": "^0.11.1", - "util": "^0.10.3" - } - }, "node_modules/pathval": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", - "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "dev": true, "engines": { "node": "*" } }, - "node_modules/phaser": { - "version": "3.55.2", - "resolved": "https://registry.npmjs.org/phaser/-/phaser-3.55.2.tgz", - "integrity": "sha512-amKXsbb2Ht29dGPKvt1edq3yGGYKtq8373GpJYGKPNPnneYY6MtVTOgjHDuZwtmUyK4v86FugkT3hzW/N4tjxQ==", - "dependencies": { - "eventemitter3": "^4.0.7", - "path": "^0.12.7" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "engines": { - "node": ">= 0.6.0" - } - }, "node_modules/regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" }, "node_modules/svelte": { - "version": "3.38.2", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.38.2.tgz", - "integrity": "sha512-q5Dq0/QHh4BLJyEVWGe7Cej5NWs040LWjMbicBGZ+3qpFWJ1YObRmUDZKbbovddLC9WW7THTj3kYbTOFmU9fbg==", + "version": "3.46.4", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.46.4.tgz", + "integrity": "sha512-qKJzw6DpA33CIa+C/rGp4AUdSfii0DOTCzj/2YpSKKayw5WGSS624Et9L1nU1k2OVRS9vaENQXp2CVZNU+xvIg==", "engines": { "node": ">= 8" } @@ -845,20 +812,32 @@ "node": ">=4" } }, - "node_modules/util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "dependencies": { - "inherits": "2.0.3" + "node_modules/ws": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.4.2.tgz", + "integrity": "sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } } }, "dependencies": { "@babel/runtime": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", - "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz", + "integrity": "sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==", "requires": { "regenerator-runtime": "^0.13.4" } @@ -903,26 +882,16 @@ "type-detect": "^4.0.0" } }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, "get-func-name": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", "dev": true }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, "jquery": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.4.1.tgz", - "integrity": "sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw==" + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", + "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" }, "meteor-node-stubs": { "version": "1.0.0", @@ -1485,44 +1454,21 @@ } } }, - "path": { - "version": "0.12.7", - "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", - "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=", - "requires": { - "process": "^0.11.1", - "util": "^0.10.3" - } - }, "pathval": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", - "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "dev": true }, - "phaser": { - "version": "3.55.2", - "resolved": "https://registry.npmjs.org/phaser/-/phaser-3.55.2.tgz", - "integrity": "sha512-amKXsbb2Ht29dGPKvt1edq3yGGYKtq8373GpJYGKPNPnneYY6MtVTOgjHDuZwtmUyK4v86FugkT3hzW/N4tjxQ==", - "requires": { - "eventemitter3": "^4.0.7", - "path": "^0.12.7" - } - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" - }, "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" }, "svelte": { - "version": "3.38.2", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.38.2.tgz", - "integrity": "sha512-q5Dq0/QHh4BLJyEVWGe7Cej5NWs040LWjMbicBGZ+3qpFWJ1YObRmUDZKbbovddLC9WW7THTj3kYbTOFmU9fbg==" + "version": "3.46.4", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.46.4.tgz", + "integrity": "sha512-qKJzw6DpA33CIa+C/rGp4AUdSfii0DOTCzj/2YpSKKayw5WGSS624Et9L1nU1k2OVRS9vaENQXp2CVZNU+xvIg==" }, "type-detect": { "version": "4.0.8", @@ -1530,13 +1476,11 @@ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, - "util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "requires": { - "inherits": "2.0.3" - } + "ws": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.4.2.tgz", + "integrity": "sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==", + "requires": {} } } } diff --git a/package.json b/package.json index d8840e5..fd2fd2e 100644 --- a/package.json +++ b/package.json @@ -3,18 +3,18 @@ "private": true, "scripts": { "start": "meteor run", - "build": "npm install --product && meteor build --architecture os.linux.x86_64 --server-only ../", + "build": "npm install --product && meteor build --architecture os.linux.x86_64 --server-only ../", "test": "meteor test --once --driver-package meteortesting:mocha", "test-app": "TEST_WATCH=1 meteor test --full-app --driver-package meteortesting:mocha", "visualize": "meteor --production --extra-packages bundle-visualizer" }, "dependencies": { - "@babel/runtime": "^7.8.3", + "@babel/runtime": "^7.16.7", "connect-route": "^0.1.5", - "jquery": "^3.4.1", + "jquery": "^3.6.0", "meteor-node-stubs": "^1.0.0", - "phaser": "3.55.2", - "svelte": "^3.31.2" + "svelte": "^3.46.4", + "ws": "^8.4.2" }, "meteor": { "mainModule": { diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..8391d99 --- /dev/null +++ b/readme.md @@ -0,0 +1,10 @@ +#Login +##Google +This app is using the Google (oauth2) API to manage logins. To do that you have to have a service configuration in the database. Place the following in the XXX collection: +``` +{ + service: 'google', + clientId: 'xxx', + secret: 'xxx' +} +``` diff --git a/server/google-oauth.js b/server/google-oauth.js index ae813f7..9c2ff4f 100644 --- a/server/google-oauth.js +++ b/server/google-oauth.js @@ -5,8 +5,18 @@ */ try { - let settingsFile = process.env.SETTINGS; - let settings = JSON.parse(Assets.getText(settingsFile)); + let settings = Assets.getText('settings.json'); + + if(settings) { + try { + settings = JSON.parse(settings); + } + catch(err) { + console.error("Failed to load the /private/settings.json file as a JSON object."); + console.error(err); + settings = null; + } + } if (settings) { ServiceConfiguration.configurations.upsert({ @@ -24,4 +34,17 @@ try { } } catch (err) { console.log(err); -} \ No newline at end of file +} + +/* +ServiceConfiguration.configurations.upsert( + { service: 'google' }, + { + $set: { + clientId: '651343079360-hm5vvji109lphnavft8vej5pp1ruek5q.apps.googleusercontent.com', + loginStyle: 'popup', + secret: 'VAQFr6UBkZ0ZMQJ7tb471BmW' + } + } +); +*/ diff --git a/server/main.js b/server/main.js index 6e0e5e3..40c621a 100644 --- a/server/main.js +++ b/server/main.js @@ -1,12 +1,39 @@ import '../imports/api/'; import './google-oauth.js'; + +import url from 'url'; +//import './google-oauth.js'; import connectRoute from 'connect-route'; -// Got the below code from: -// https://docs.meteor.com/packages/webapp.html -WebApp.connectHandlers.use(connectRoute((router) => { - router.get('/ping', (req, res, next) => { - //TODO: Change ping / pong to something appropriate for a browser plugin reporting user/machine data and requesting updates. - res.end("pong"); - }); -})); \ No newline at end of file +/* Did not work at all.. not sure why. +let WebSocketServer = require("ws").Server; +//var wss = new WebSocketServer({ port: env.PORT }); +let wss = new WebSocketServer({host: '192.168.3.101', port: 3001}); + +console.log("Starting WS"); + +wss.on("connection", function (ws) { + console.log("WS Open"); + + ws.on("message", function(data) { + console.log(data); + ws.send("Pong"); + }).on("error", (err) => { + console.log(err); + }) +}).on('error', (err) => { + console.error(err); +}); + +// const net = require('net'); +// +// const server = net.createServer((socket) => { +// socket.on('data', (data) => { +// console.log(data.toString()); +// socket.write("Pong"); +// }); +// }).on('error', (err) => { +// console.error(err); +// }); + + */