From e881500ba8cbc73b5b77a7170bbee4e06899d116 Mon Sep 17 00:00:00 2001 From: mnnnnn Date: Fri, 2 Mar 2018 19:39:18 -0500 Subject: [PATCH 1/3] post pictures working --- RaftPackAngular/package-lock.json | 3936 +++++++++++++++++ RaftPackAngular/package.json | 2 + RaftPackAngular/src/app/app-routing.module.ts | 12 +- RaftPackAngular/src/app/app.component.ts | 2 +- RaftPackAngular/src/app/app.module.ts | 17 +- .../app/dashboard/dashboard.component.html | 4 +- .../src/app/feed/feed.component.html | 2 +- .../form-data-upload.component.css | 0 .../form-data-upload.component.html | 11 + .../form-data-upload.component.ts | 74 + .../friend-profile.component.css | 0 .../friend-profile.component.html | 16 + .../friend-profile.component.spec.ts | 25 + .../friend-profile.component.ts | 35 + .../src/app/login/login.component.ts | 1 + .../modify-user-info.component.html | 56 +- .../src/app/navbar/navbar.component.css | 42 + .../src/app/navbar/navbar.component.html | 17 +- .../src/app/navbar/navbar.component.ts | 28 +- .../src/app/post/post.component.html | 6 +- .../src/app/post/post.component.ts | 10 +- .../profile-detail.component.css | 0 .../profile-detail.component.html | 21 + .../profile-detail.component.spec.ts | 25 + .../profile-detail.component.ts | 24 + .../src/app/profile/profile.component.html | 7 + .../src/app/profile/profile.component.ts | 36 +- .../src/app/search/search.component.css | 0 .../src/app/search/search.component.html | 3 + .../src/app/search/search.component.spec.ts | 25 + .../src/app/search/search.component.ts | 40 + .../src/app/services/login.service.spec.ts | 15 - .../src/app/services/login.service.ts | 1 + .../src/app/services/post.service.ts | 10 + .../src/app/services/search.service.ts | 51 + .../src/app/services/upload.service.ts | 4 +- RaftPackSpring/.classpath | 21 +- RaftPackSpring/.springBeans | 2 +- .../src/main/java/com/revature/Main.java | 10 +- .../controller/ModifyUserController.java | 28 + .../revature/controller/PostController.java | 0 .../revature/controller/UserController.java | 20 +- .../main/java/com/revature/model/Image.java | 3 +- .../main/java/com/revature/model/Post.java | 54 +- .../main/java/com/revature/model/User.java | 45 +- .../java/com/revature/pojo/ModifyUser.java | 83 + .../repository/UserRepositoryImpl.java | 8 +- .../com/revature/service/EmailService.java | 26 + .../service/ModifyUserServiceImpl.java | 21 + .../com/revature/service/PostService.java | 1 + .../com/revature/service/PostServiceImpl.java | 8 +- .../com/revature/service/UserServiceImpl.java | 7 +- .../src/main/resources/applicationContext.xml | 66 + .../webapp/WEB-INF/applicationContext.xml | 34 +- .../main/webapp/WEB-INF/lib/activation.jar | Bin 0 -> 56290 bytes .../src/main/webapp/WEB-INF/web.xml | 58 +- .../com/revature/test/ControllerTests.java | 75 + .../com/revature/test/EmailServiceTest.java | 38 + .../src/test/resources/applicationContext.xml | 66 + .../target/classes/com/revature/Main.class | Bin 1117 -> 1254 bytes .../revature/controller/UserController.class | Bin 4660 -> 5440 bytes .../classes/com/revature/model/Image.class | Bin 2448 -> 2404 bytes .../classes/com/revature/model/Post.class | Bin 5044 -> 4463 bytes .../classes/com/revature/model/User.class | Bin 8481 -> 9082 bytes .../repository/UserRepositoryImpl.class | Bin 4141 -> 4224 bytes .../revature/service/UserServiceImpl.class | Bin 2994 -> 3059 bytes .../RaftPackSpring/pom.properties | 4 +- package-lock.json | 10 +- 68 files changed, 5041 insertions(+), 205 deletions(-) create mode 100644 RaftPackAngular/src/app/form-data-upload/form-data-upload.component.css create mode 100644 RaftPackAngular/src/app/form-data-upload/form-data-upload.component.html create mode 100644 RaftPackAngular/src/app/form-data-upload/form-data-upload.component.ts create mode 100644 RaftPackAngular/src/app/friend-profile/friend-profile.component.css create mode 100644 RaftPackAngular/src/app/friend-profile/friend-profile.component.html create mode 100644 RaftPackAngular/src/app/friend-profile/friend-profile.component.spec.ts create mode 100644 RaftPackAngular/src/app/friend-profile/friend-profile.component.ts create mode 100644 RaftPackAngular/src/app/profile-detail/profile-detail.component.css create mode 100644 RaftPackAngular/src/app/profile-detail/profile-detail.component.html create mode 100644 RaftPackAngular/src/app/profile-detail/profile-detail.component.spec.ts create mode 100644 RaftPackAngular/src/app/profile-detail/profile-detail.component.ts create mode 100644 RaftPackAngular/src/app/search/search.component.css create mode 100644 RaftPackAngular/src/app/search/search.component.html create mode 100644 RaftPackAngular/src/app/search/search.component.spec.ts create mode 100644 RaftPackAngular/src/app/search/search.component.ts delete mode 100644 RaftPackAngular/src/app/services/login.service.spec.ts create mode 100644 RaftPackAngular/src/app/services/search.service.ts create mode 100644 RaftPackSpring/src/main/java/com/revature/controller/ModifyUserController.java create mode 100644 RaftPackSpring/src/main/java/com/revature/controller/PostController.java create mode 100644 RaftPackSpring/src/main/java/com/revature/pojo/ModifyUser.java create mode 100644 RaftPackSpring/src/main/java/com/revature/service/EmailService.java create mode 100644 RaftPackSpring/src/main/java/com/revature/service/ModifyUserServiceImpl.java create mode 100644 RaftPackSpring/src/main/resources/applicationContext.xml create mode 100644 RaftPackSpring/src/main/webapp/WEB-INF/lib/activation.jar create mode 100644 RaftPackSpring/src/test/java/com/revature/test/ControllerTests.java create mode 100644 RaftPackSpring/src/test/java/com/revature/test/EmailServiceTest.java create mode 100644 RaftPackSpring/src/test/resources/applicationContext.xml diff --git a/RaftPackAngular/package-lock.json b/RaftPackAngular/package-lock.json index ba0d36b..2fbd099 100644 --- a/RaftPackAngular/package-lock.json +++ b/RaftPackAngular/package-lock.json @@ -7676,6 +7676,11 @@ "dev": true, "optional": true }, + "ng-file-upload": { + "version": "12.2.13", + "resolved": "https://registry.npmjs.org/ng-file-upload/-/ng-file-upload-12.2.13.tgz", + "integrity": "sha1-AYAPOHLlJvlTEPhHfpnk8S0NjRQ=" + }, "no-case": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", @@ -8021,6 +8026,3937 @@ "sort-keys": "1.1.2" } }, + "npm": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/npm/-/npm-5.7.1.tgz", + "integrity": "sha512-r1grvv6mcEt+nlMzMWPc5n/z5q8NNuBWj0TGFp1PBSFCl6ubnAoUGBsucYsnZYT7MOJn0ha1ptEjmdBoAdJ+SA==", + "requires": { + "JSONStream": "1.3.2", + "abbrev": "1.1.1", + "ansi-regex": "3.0.0", + "ansicolors": "0.3.2", + "ansistyles": "0.1.3", + "aproba": "1.2.0", + "archy": "1.0.0", + "bin-links": "1.1.0", + "bluebird": "3.5.1", + "cacache": "10.0.4", + "call-limit": "1.1.0", + "chownr": "1.0.1", + "cli-table2": "0.2.0", + "cmd-shim": "2.0.2", + "columnify": "1.5.4", + "config-chain": "1.1.11", + "debuglog": "1.0.1", + "detect-indent": "5.0.0", + "dezalgo": "1.0.3", + "editor": "1.0.0", + "find-npm-prefix": "1.0.2", + "fs-vacuum": "1.2.10", + "fs-write-stream-atomic": "1.0.10", + "gentle-fs": "2.0.1", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "has-unicode": "2.0.1", + "hosted-git-info": "2.5.0", + "iferr": "0.1.5", + "imurmurhash": "0.1.4", + "inflight": "1.0.6", + "inherits": "2.0.3", + "ini": "1.3.5", + "init-package-json": "1.10.1", + "is-cidr": "1.0.0", + "lazy-property": "1.0.0", + "libcipm": "1.3.3", + "libnpx": "9.7.1", + "lockfile": "1.0.3", + "lodash._baseindexof": "3.1.0", + "lodash._baseuniq": "4.6.0", + "lodash._bindcallback": "3.0.1", + "lodash._cacheindexof": "3.0.2", + "lodash._createcache": "3.1.2", + "lodash._getnative": "3.9.1", + "lodash.clonedeep": "4.5.0", + "lodash.restparam": "3.6.1", + "lodash.union": "4.6.0", + "lodash.uniq": "4.5.0", + "lodash.without": "4.4.0", + "lru-cache": "4.1.1", + "meant": "1.0.1", + "mississippi": "2.0.0", + "mkdirp": "0.5.1", + "move-concurrently": "1.0.1", + "nopt": "4.0.1", + "normalize-package-data": "2.4.0", + "npm-cache-filename": "1.0.2", + "npm-install-checks": "3.0.0", + "npm-lifecycle": "2.0.0", + "npm-package-arg": "6.0.0", + "npm-packlist": "1.1.10", + "npm-profile": "3.0.1", + "npm-registry-client": "8.5.0", + "npm-user-validate": "1.0.0", + "npmlog": "4.1.2", + "once": "1.4.0", + "opener": "1.4.3", + "osenv": "0.1.5", + "pacote": "7.3.3", + "path-is-inside": "1.0.2", + "promise-inflight": "1.0.1", + "qrcode-terminal": "0.11.0", + "query-string": "5.1.0", + "qw": "1.0.1", + "read": "1.0.7", + "read-cmd-shim": "1.0.1", + "read-installed": "4.0.3", + "read-package-json": "2.0.12", + "read-package-tree": "5.1.6", + "readable-stream": "2.3.4", + "readdir-scoped-modules": "1.0.2", + "request": "2.83.0", + "retry": "0.10.1", + "rimraf": "2.6.2", + "safe-buffer": "5.1.1", + "semver": "5.5.0", + "sha": "2.0.1", + "slide": "1.1.6", + "sorted-object": "2.0.1", + "sorted-union-stream": "2.1.3", + "ssri": "5.2.4", + "strip-ansi": "4.0.0", + "tar": "4.3.3", + "text-table": "0.2.0", + "uid-number": "0.0.6", + "umask": "1.1.0", + "unique-filename": "1.1.0", + "unpipe": "1.0.0", + "update-notifier": "2.3.0", + "uuid": "3.2.1", + "validate-npm-package-license": "3.0.1", + "validate-npm-package-name": "3.0.0", + "which": "1.3.0", + "worker-farm": "1.5.2", + "wrappy": "1.0.2", + "write-file-atomic": "2.1.0" + }, + "dependencies": { + "JSONStream": { + "version": "1.3.2", + "bundled": true, + "requires": { + "jsonparse": "1.3.1", + "through": "2.3.8" + }, + "dependencies": { + "jsonparse": { + "version": "1.3.1", + "bundled": true + }, + "through": { + "version": "2.3.8", + "bundled": true + } + } + }, + "abbrev": { + "version": "1.1.1", + "bundled": true + }, + "ansi-regex": { + "version": "3.0.0", + "bundled": true + }, + "ansicolors": { + "version": "0.3.2", + "bundled": true + }, + "ansistyles": { + "version": "0.1.3", + "bundled": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true + }, + "archy": { + "version": "1.0.0", + "bundled": true + }, + "bin-links": { + "version": "1.1.0", + "bundled": true, + "requires": { + "bluebird": "3.5.1", + "cmd-shim": "2.0.2", + "fs-write-stream-atomic": "1.0.10", + "gentle-fs": "2.0.1", + "graceful-fs": "4.1.11", + "slide": "1.1.6" + } + }, + "bluebird": { + "version": "3.5.1", + "bundled": true + }, + "cacache": { + "version": "10.0.4", + "bundled": true, + "requires": { + "bluebird": "3.5.1", + "chownr": "1.0.1", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "lru-cache": "4.1.1", + "mississippi": "2.0.0", + "mkdirp": "0.5.1", + "move-concurrently": "1.0.1", + "promise-inflight": "1.0.1", + "rimraf": "2.6.2", + "ssri": "5.2.4", + "unique-filename": "1.1.0", + "y18n": "4.0.0" + }, + "dependencies": { + "y18n": { + "version": "4.0.0", + "bundled": true + } + } + }, + "call-limit": { + "version": "1.1.0", + "bundled": true + }, + "chownr": { + "version": "1.0.1", + "bundled": true + }, + "cli-table2": { + "version": "0.2.0", + "bundled": true, + "requires": { + "colors": "1.1.2", + "lodash": "3.10.1", + "string-width": "1.0.2" + }, + "dependencies": { + "colors": { + "version": "1.1.2", + "bundled": true, + "optional": true + }, + "lodash": { + "version": "3.10.1", + "bundled": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "1.0.1" + }, + "dependencies": { + "number-is-nan": { + "version": "1.0.1", + "bundled": true + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "bundled": true + } + } + } + } + } + } + }, + "cmd-shim": { + "version": "2.0.2", + "bundled": true, + "requires": { + "graceful-fs": "4.1.11", + "mkdirp": "0.5.1" + } + }, + "columnify": { + "version": "1.5.4", + "bundled": true, + "requires": { + "strip-ansi": "3.0.1", + "wcwidth": "1.0.1" + }, + "dependencies": { + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "bundled": true + } + } + }, + "wcwidth": { + "version": "1.0.1", + "bundled": true, + "requires": { + "defaults": "1.0.3" + }, + "dependencies": { + "defaults": { + "version": "1.0.3", + "bundled": true, + "requires": { + "clone": "1.0.2" + }, + "dependencies": { + "clone": { + "version": "1.0.2", + "bundled": true + } + } + } + } + } + } + }, + "config-chain": { + "version": "1.1.11", + "bundled": true, + "requires": { + "ini": "1.3.5", + "proto-list": "1.2.4" + }, + "dependencies": { + "proto-list": { + "version": "1.2.4", + "bundled": true + } + } + }, + "debuglog": { + "version": "1.0.1", + "bundled": true + }, + "detect-indent": { + "version": "5.0.0", + "bundled": true + }, + "dezalgo": { + "version": "1.0.3", + "bundled": true, + "requires": { + "asap": "2.0.5", + "wrappy": "1.0.2" + }, + "dependencies": { + "asap": { + "version": "2.0.5", + "bundled": true + } + } + }, + "editor": { + "version": "1.0.0", + "bundled": true + }, + "find-npm-prefix": { + "version": "1.0.2", + "bundled": true + }, + "fs-vacuum": { + "version": "1.2.10", + "bundled": true, + "requires": { + "graceful-fs": "4.1.11", + "path-is-inside": "1.0.2", + "rimraf": "2.6.2" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "bundled": true, + "requires": { + "graceful-fs": "4.1.11", + "iferr": "0.1.5", + "imurmurhash": "0.1.4", + "readable-stream": "2.3.4" + } + }, + "gentle-fs": { + "version": "2.0.1", + "bundled": true, + "requires": { + "aproba": "1.2.0", + "fs-vacuum": "1.2.10", + "graceful-fs": "4.1.11", + "iferr": "0.1.5", + "mkdirp": "0.5.1", + "path-is-inside": "1.0.2", + "read-cmd-shim": "1.0.1", + "slide": "1.1.6" + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + }, + "dependencies": { + "fs.realpath": { + "version": "1.0.0", + "bundled": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "1.1.8" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.8", + "bundled": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "1.0.0", + "bundled": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + } + } + } + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true + } + } + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true + }, + "hosted-git-info": { + "version": "2.5.0", + "bundled": true + }, + "iferr": { + "version": "0.1.5", + "bundled": true + }, + "imurmurhash": { + "version": "0.1.4", + "bundled": true + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true + }, + "ini": { + "version": "1.3.5", + "bundled": true + }, + "init-package-json": { + "version": "1.10.1", + "bundled": true, + "requires": { + "glob": "7.1.2", + "npm-package-arg": "5.1.2", + "promzard": "0.3.0", + "read": "1.0.7", + "read-package-json": "2.0.12", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.1", + "validate-npm-package-name": "3.0.0" + }, + "dependencies": { + "npm-package-arg": { + "version": "5.1.2", + "bundled": true, + "requires": { + "hosted-git-info": "2.5.0", + "osenv": "0.1.5", + "semver": "5.5.0", + "validate-npm-package-name": "3.0.0" + } + }, + "promzard": { + "version": "0.3.0", + "bundled": true, + "requires": { + "read": "1.0.7" + } + } + } + }, + "is-cidr": { + "version": "1.0.0", + "bundled": true, + "requires": { + "cidr-regex": "1.0.6" + }, + "dependencies": { + "cidr-regex": { + "version": "1.0.6", + "bundled": true + } + } + }, + "lazy-property": { + "version": "1.0.0", + "bundled": true + }, + "libcipm": { + "version": "1.3.3", + "bundled": true, + "requires": { + "bin-links": "1.1.0", + "bluebird": "3.5.1", + "find-npm-prefix": "1.0.2", + "graceful-fs": "4.1.11", + "lock-verify": "2.0.0", + "npm-lifecycle": "2.0.0", + "npm-logical-tree": "1.2.1", + "npm-package-arg": "6.0.0", + "pacote": "7.3.3", + "protoduck": "5.0.0", + "read-package-json": "2.0.12", + "rimraf": "2.6.2", + "worker-farm": "1.5.2" + }, + "dependencies": { + "find-npm-prefix": { + "version": "1.0.2", + "bundled": true + }, + "lock-verify": { + "version": "2.0.0", + "bundled": true, + "requires": { + "npm-package-arg": "5.1.2", + "semver": "5.5.0" + }, + "dependencies": { + "npm-package-arg": { + "version": "5.1.2", + "bundled": true, + "requires": { + "hosted-git-info": "2.5.0", + "osenv": "0.1.5", + "semver": "5.5.0", + "validate-npm-package-name": "3.0.0" + } + } + } + }, + "npm-logical-tree": { + "version": "1.2.1", + "bundled": true + }, + "protoduck": { + "version": "5.0.0", + "bundled": true, + "requires": { + "genfun": "4.0.1" + }, + "dependencies": { + "genfun": { + "version": "4.0.1", + "bundled": true + } + } + }, + "worker-farm": { + "version": "1.5.2", + "bundled": true, + "requires": { + "errno": "0.1.7", + "xtend": "4.0.1" + }, + "dependencies": { + "errno": { + "version": "0.1.7", + "bundled": true, + "requires": { + "prr": "1.0.1" + }, + "dependencies": { + "prr": { + "version": "1.0.1", + "bundled": true + } + } + }, + "xtend": { + "version": "4.0.1", + "bundled": true + } + } + } + } + }, + "libnpx": { + "version": "9.7.1", + "bundled": true, + "requires": { + "dotenv": "4.0.0", + "npm-package-arg": "5.1.2", + "rimraf": "2.6.2", + "safe-buffer": "5.1.1", + "update-notifier": "2.3.0", + "which": "1.3.0", + "y18n": "3.2.1", + "yargs": "8.0.2" + }, + "dependencies": { + "dotenv": { + "version": "4.0.0", + "bundled": true + }, + "npm-package-arg": { + "version": "5.1.2", + "bundled": true, + "requires": { + "hosted-git-info": "2.5.0", + "osenv": "0.1.5", + "semver": "5.5.0", + "validate-npm-package-name": "3.0.0" + } + }, + "y18n": { + "version": "3.2.1", + "bundled": true + }, + "yargs": { + "version": "8.0.2", + "bundled": true, + "requires": { + "camelcase": "4.1.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "read-pkg-up": "2.0.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "7.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "bundled": true + }, + "cliui": { + "version": "3.2.0", + "bundled": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "1.0.1" + }, + "dependencies": { + "number-is-nan": { + "version": "1.0.1", + "bundled": true + } + } + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "bundled": true + } + } + }, + "wrap-ansi": { + "version": "2.1.0", + "bundled": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + } + } + } + }, + "decamelize": { + "version": "1.2.0", + "bundled": true + }, + "get-caller-file": { + "version": "1.0.2", + "bundled": true + }, + "os-locale": { + "version": "2.1.0", + "bundled": true, + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + }, + "dependencies": { + "execa": { + "version": "0.7.0", + "bundled": true, + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "bundled": true, + "requires": { + "lru-cache": "4.1.1", + "shebang-command": "1.2.0", + "which": "1.3.0" + }, + "dependencies": { + "shebang-command": { + "version": "1.2.0", + "bundled": true, + "requires": { + "shebang-regex": "1.0.0" + }, + "dependencies": { + "shebang-regex": { + "version": "1.0.0", + "bundled": true + } + } + } + } + }, + "get-stream": { + "version": "3.0.0", + "bundled": true + }, + "is-stream": { + "version": "1.1.0", + "bundled": true + }, + "npm-run-path": { + "version": "2.0.2", + "bundled": true, + "requires": { + "path-key": "2.0.1" + }, + "dependencies": { + "path-key": { + "version": "2.0.1", + "bundled": true + } + } + }, + "p-finally": { + "version": "1.0.0", + "bundled": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true + }, + "strip-eof": { + "version": "1.0.0", + "bundled": true + } + } + }, + "lcid": { + "version": "1.0.0", + "bundled": true, + "requires": { + "invert-kv": "1.0.0" + }, + "dependencies": { + "invert-kv": { + "version": "1.0.0", + "bundled": true + } + } + }, + "mem": { + "version": "1.1.0", + "bundled": true, + "requires": { + "mimic-fn": "1.1.0" + }, + "dependencies": { + "mimic-fn": { + "version": "1.1.0", + "bundled": true + } + } + } + } + }, + "read-pkg-up": { + "version": "2.0.0", + "bundled": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "2.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "bundled": true, + "requires": { + "locate-path": "2.0.0" + }, + "dependencies": { + "locate-path": { + "version": "2.0.0", + "bundled": true, + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + }, + "dependencies": { + "p-locate": { + "version": "2.0.0", + "bundled": true, + "requires": { + "p-limit": "1.1.0" + }, + "dependencies": { + "p-limit": { + "version": "1.1.0", + "bundled": true + } + } + }, + "path-exists": { + "version": "3.0.0", + "bundled": true + } + } + } + } + }, + "read-pkg": { + "version": "2.0.0", + "bundled": true, + "requires": { + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" + }, + "dependencies": { + "load-json-file": { + "version": "2.0.0", + "bundled": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + }, + "dependencies": { + "parse-json": { + "version": "2.2.0", + "bundled": true, + "requires": { + "error-ex": "1.3.1" + }, + "dependencies": { + "error-ex": { + "version": "1.3.1", + "bundled": true, + "requires": { + "is-arrayish": "0.2.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.2.1", + "bundled": true + } + } + } + } + }, + "pify": { + "version": "2.3.0", + "bundled": true + }, + "strip-bom": { + "version": "3.0.0", + "bundled": true + } + } + }, + "path-type": { + "version": "2.0.0", + "bundled": true, + "requires": { + "pify": "2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "bundled": true + } + } + } + } + } + } + }, + "require-directory": { + "version": "2.1.1", + "bundled": true + }, + "require-main-filename": { + "version": "1.0.1", + "bundled": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true + }, + "string-width": { + "version": "2.1.1", + "bundled": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "bundled": true + } + } + }, + "which-module": { + "version": "2.0.0", + "bundled": true + }, + "yargs-parser": { + "version": "7.0.0", + "bundled": true, + "requires": { + "camelcase": "4.1.0" + } + } + } + } + } + }, + "lockfile": { + "version": "1.0.3", + "bundled": true + }, + "lodash._baseindexof": { + "version": "3.1.0", + "bundled": true + }, + "lodash._baseuniq": { + "version": "4.6.0", + "bundled": true, + "requires": { + "lodash._createset": "4.0.3", + "lodash._root": "3.0.1" + }, + "dependencies": { + "lodash._createset": { + "version": "4.0.3", + "bundled": true + }, + "lodash._root": { + "version": "3.0.1", + "bundled": true + } + } + }, + "lodash._bindcallback": { + "version": "3.0.1", + "bundled": true + }, + "lodash._cacheindexof": { + "version": "3.0.2", + "bundled": true + }, + "lodash._createcache": { + "version": "3.1.2", + "bundled": true, + "requires": { + "lodash._getnative": "3.9.1" + } + }, + "lodash._getnative": { + "version": "3.9.1", + "bundled": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "bundled": true + }, + "lodash.restparam": { + "version": "3.6.1", + "bundled": true + }, + "lodash.union": { + "version": "4.6.0", + "bundled": true + }, + "lodash.uniq": { + "version": "4.5.0", + "bundled": true + }, + "lodash.without": { + "version": "4.4.0", + "bundled": true + }, + "lru-cache": { + "version": "4.1.1", + "bundled": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + }, + "dependencies": { + "pseudomap": { + "version": "1.0.2", + "bundled": true + }, + "yallist": { + "version": "2.1.2", + "bundled": true + } + } + }, + "meant": { + "version": "1.0.1", + "bundled": true + }, + "mississippi": { + "version": "2.0.0", + "bundled": true, + "requires": { + "concat-stream": "1.6.0", + "duplexify": "3.5.3", + "end-of-stream": "1.4.1", + "flush-write-stream": "1.0.2", + "from2": "2.3.0", + "parallel-transform": "1.1.0", + "pump": "2.0.1", + "pumpify": "1.4.0", + "stream-each": "1.2.2", + "through2": "2.0.3" + }, + "dependencies": { + "concat-stream": { + "version": "1.6.0", + "bundled": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.4", + "typedarray": "0.0.6" + }, + "dependencies": { + "typedarray": { + "version": "0.0.6", + "bundled": true + } + } + }, + "duplexify": { + "version": "3.5.3", + "bundled": true, + "requires": { + "end-of-stream": "1.4.1", + "inherits": "2.0.3", + "readable-stream": "2.3.4", + "stream-shift": "1.0.0" + }, + "dependencies": { + "stream-shift": { + "version": "1.0.0", + "bundled": true + } + } + }, + "end-of-stream": { + "version": "1.4.1", + "bundled": true, + "requires": { + "once": "1.4.0" + } + }, + "flush-write-stream": { + "version": "1.0.2", + "bundled": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.4" + } + }, + "from2": { + "version": "2.3.0", + "bundled": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.4" + } + }, + "parallel-transform": { + "version": "1.1.0", + "bundled": true, + "requires": { + "cyclist": "0.2.2", + "inherits": "2.0.3", + "readable-stream": "2.3.4" + }, + "dependencies": { + "cyclist": { + "version": "0.2.2", + "bundled": true + } + } + }, + "pump": { + "version": "2.0.1", + "bundled": true, + "requires": { + "end-of-stream": "1.4.1", + "once": "1.4.0" + } + }, + "pumpify": { + "version": "1.4.0", + "bundled": true, + "requires": { + "duplexify": "3.5.3", + "inherits": "2.0.3", + "pump": "2.0.1" + } + }, + "stream-each": { + "version": "1.2.2", + "bundled": true, + "requires": { + "end-of-stream": "1.4.1", + "stream-shift": "1.0.0" + }, + "dependencies": { + "stream-shift": { + "version": "1.0.0", + "bundled": true + } + } + }, + "through2": { + "version": "2.0.3", + "bundled": true, + "requires": { + "readable-stream": "2.3.4", + "xtend": "4.0.1" + }, + "dependencies": { + "xtend": { + "version": "4.0.1", + "bundled": true + } + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "bundled": true + } + } + }, + "move-concurrently": { + "version": "1.0.1", + "bundled": true, + "requires": { + "aproba": "1.2.0", + "copy-concurrently": "1.0.5", + "fs-write-stream-atomic": "1.0.10", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "run-queue": "1.0.3" + }, + "dependencies": { + "copy-concurrently": { + "version": "1.0.5", + "bundled": true, + "requires": { + "aproba": "1.2.0", + "fs-write-stream-atomic": "1.0.10", + "iferr": "0.1.5", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "run-queue": "1.0.3" + } + }, + "run-queue": { + "version": "1.0.3", + "bundled": true, + "requires": { + "aproba": "1.2.0" + } + } + } + }, + "node-gyp": { + "version": "3.6.2", + "bundled": true, + "requires": { + "fstream": "1.0.11", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "nopt": "3.0.6", + "npmlog": "4.1.2", + "osenv": "0.1.5", + "request": "2.83.0", + "rimraf": "2.6.2", + "semver": "5.3.0", + "tar": "2.2.1", + "which": "1.3.0" + }, + "dependencies": { + "fstream": { + "version": "1.0.11", + "bundled": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.2" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "1.1.8" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.8", + "bundled": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "1.0.0", + "bundled": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + } + } + } + } + }, + "nopt": { + "version": "3.0.6", + "bundled": true, + "requires": { + "abbrev": "1.1.1" + } + }, + "semver": { + "version": "5.3.0", + "bundled": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + }, + "dependencies": { + "block-stream": { + "version": "0.0.9", + "bundled": true, + "requires": { + "inherits": "2.0.3" + } + } + } + } + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "requires": { + "abbrev": "1.1.1", + "osenv": "0.1.5" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "bundled": true, + "requires": { + "hosted-git-info": "2.5.0", + "is-builtin-module": "1.0.0", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.1" + }, + "dependencies": { + "is-builtin-module": { + "version": "1.0.0", + "bundled": true, + "requires": { + "builtin-modules": "1.1.1" + }, + "dependencies": { + "builtin-modules": { + "version": "1.1.1", + "bundled": true + } + } + } + } + }, + "npm-cache-filename": { + "version": "1.0.2", + "bundled": true + }, + "npm-install-checks": { + "version": "3.0.0", + "bundled": true, + "requires": { + "semver": "5.5.0" + } + }, + "npm-lifecycle": { + "version": "2.0.0", + "bundled": true, + "requires": { + "byline": "5.0.0", + "graceful-fs": "4.1.11", + "node-gyp": "3.6.2", + "resolve-from": "4.0.0", + "slide": "1.1.6", + "uid-number": "0.0.6", + "umask": "1.1.0", + "which": "1.3.0" + }, + "dependencies": { + "byline": { + "version": "5.0.0", + "bundled": true + }, + "resolve-from": { + "version": "4.0.0", + "bundled": true + } + } + }, + "npm-package-arg": { + "version": "6.0.0", + "bundled": true, + "requires": { + "hosted-git-info": "2.5.0", + "osenv": "0.1.5", + "semver": "5.5.0", + "validate-npm-package-name": "3.0.0" + } + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "requires": { + "ignore-walk": "3.0.1", + "npm-bundled": "1.0.3" + }, + "dependencies": { + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "requires": { + "minimatch": "3.0.4" + }, + "dependencies": { + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "1.1.8" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.8", + "bundled": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "1.0.0", + "bundled": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + } + } + } + } + } + } + }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true + } + } + }, + "npm-profile": { + "version": "3.0.1", + "bundled": true, + "requires": { + "aproba": "1.2.0", + "make-fetch-happen": "2.6.0" + }, + "dependencies": { + "make-fetch-happen": { + "version": "2.6.0", + "bundled": true, + "requires": { + "agentkeepalive": "3.3.0", + "cacache": "10.0.4", + "http-cache-semantics": "3.8.1", + "http-proxy-agent": "2.0.0", + "https-proxy-agent": "2.1.1", + "lru-cache": "4.1.1", + "mississippi": "1.3.1", + "node-fetch-npm": "2.0.2", + "promise-retry": "1.1.1", + "socks-proxy-agent": "3.0.1", + "ssri": "5.2.4" + }, + "dependencies": { + "agentkeepalive": { + "version": "3.3.0", + "bundled": true, + "requires": { + "humanize-ms": "1.2.1" + }, + "dependencies": { + "humanize-ms": { + "version": "1.2.1", + "bundled": true, + "requires": { + "ms": "2.1.1" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "bundled": true + } + } + } + } + }, + "http-cache-semantics": { + "version": "3.8.1", + "bundled": true + }, + "http-proxy-agent": { + "version": "2.0.0", + "bundled": true, + "requires": { + "agent-base": "4.2.0", + "debug": "2.6.9" + }, + "dependencies": { + "agent-base": { + "version": "4.2.0", + "bundled": true, + "requires": { + "es6-promisify": "5.0.0" + }, + "dependencies": { + "es6-promisify": { + "version": "5.0.0", + "bundled": true, + "requires": { + "es6-promise": "4.2.4" + }, + "dependencies": { + "es6-promise": { + "version": "4.2.4", + "bundled": true + } + } + } + } + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "bundled": true + } + } + } + } + }, + "https-proxy-agent": { + "version": "2.1.1", + "bundled": true, + "requires": { + "agent-base": "4.2.0", + "debug": "3.1.0" + }, + "dependencies": { + "agent-base": { + "version": "4.2.0", + "bundled": true, + "requires": { + "es6-promisify": "5.0.0" + }, + "dependencies": { + "es6-promisify": { + "version": "5.0.0", + "bundled": true, + "requires": { + "es6-promise": "4.2.4" + }, + "dependencies": { + "es6-promise": { + "version": "4.2.4", + "bundled": true + } + } + } + } + }, + "debug": { + "version": "3.1.0", + "bundled": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "bundled": true + } + } + } + } + }, + "mississippi": { + "version": "1.3.1", + "bundled": true, + "requires": { + "concat-stream": "1.6.0", + "duplexify": "3.5.3", + "end-of-stream": "1.4.1", + "flush-write-stream": "1.0.2", + "from2": "2.3.0", + "parallel-transform": "1.1.0", + "pump": "1.0.3", + "pumpify": "1.4.0", + "stream-each": "1.2.2", + "through2": "2.0.3" + }, + "dependencies": { + "concat-stream": { + "version": "1.6.0", + "bundled": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.4", + "typedarray": "0.0.6" + }, + "dependencies": { + "typedarray": { + "version": "0.0.6", + "bundled": true + } + } + }, + "duplexify": { + "version": "3.5.3", + "bundled": true, + "requires": { + "end-of-stream": "1.4.1", + "inherits": "2.0.3", + "readable-stream": "2.3.4", + "stream-shift": "1.0.0" + }, + "dependencies": { + "stream-shift": { + "version": "1.0.0", + "bundled": true + } + } + }, + "end-of-stream": { + "version": "1.4.1", + "bundled": true, + "requires": { + "once": "1.4.0" + } + }, + "flush-write-stream": { + "version": "1.0.2", + "bundled": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.4" + } + }, + "from2": { + "version": "2.3.0", + "bundled": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.4" + } + }, + "parallel-transform": { + "version": "1.1.0", + "bundled": true, + "requires": { + "cyclist": "0.2.2", + "inherits": "2.0.3", + "readable-stream": "2.3.4" + }, + "dependencies": { + "cyclist": { + "version": "0.2.2", + "bundled": true + } + } + }, + "pump": { + "version": "1.0.3", + "bundled": true, + "requires": { + "end-of-stream": "1.4.1", + "once": "1.4.0" + } + }, + "pumpify": { + "version": "1.4.0", + "bundled": true, + "requires": { + "duplexify": "3.5.3", + "inherits": "2.0.3", + "pump": "2.0.1" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "bundled": true, + "requires": { + "end-of-stream": "1.4.1", + "once": "1.4.0" + } + } + } + }, + "stream-each": { + "version": "1.2.2", + "bundled": true, + "requires": { + "end-of-stream": "1.4.1", + "stream-shift": "1.0.0" + }, + "dependencies": { + "stream-shift": { + "version": "1.0.0", + "bundled": true + } + } + }, + "through2": { + "version": "2.0.3", + "bundled": true, + "requires": { + "readable-stream": "2.3.4", + "xtend": "4.0.1" + }, + "dependencies": { + "xtend": { + "version": "4.0.1", + "bundled": true + } + } + } + } + }, + "node-fetch-npm": { + "version": "2.0.2", + "bundled": true, + "requires": { + "encoding": "0.1.12", + "json-parse-better-errors": "1.0.1", + "safe-buffer": "5.1.1" + }, + "dependencies": { + "encoding": { + "version": "0.1.12", + "bundled": true, + "requires": { + "iconv-lite": "0.4.19" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.19", + "bundled": true + } + } + }, + "json-parse-better-errors": { + "version": "1.0.1", + "bundled": true + } + } + }, + "promise-retry": { + "version": "1.1.1", + "bundled": true, + "requires": { + "err-code": "1.1.2", + "retry": "0.10.1" + }, + "dependencies": { + "err-code": { + "version": "1.1.2", + "bundled": true + } + } + }, + "socks-proxy-agent": { + "version": "3.0.1", + "bundled": true, + "requires": { + "agent-base": "4.2.0", + "socks": "1.1.10" + }, + "dependencies": { + "agent-base": { + "version": "4.2.0", + "bundled": true, + "requires": { + "es6-promisify": "5.0.0" + }, + "dependencies": { + "es6-promisify": { + "version": "5.0.0", + "bundled": true, + "requires": { + "es6-promise": "4.2.4" + }, + "dependencies": { + "es6-promise": { + "version": "4.2.4", + "bundled": true + } + } + } + } + }, + "socks": { + "version": "1.1.10", + "bundled": true, + "requires": { + "ip": "1.1.5", + "smart-buffer": "1.1.15" + }, + "dependencies": { + "ip": { + "version": "1.1.5", + "bundled": true + }, + "smart-buffer": { + "version": "1.1.15", + "bundled": true + } + } + } + } + } + } + } + } + }, + "npm-registry-client": { + "version": "8.5.0", + "bundled": true, + "requires": { + "concat-stream": "1.6.0", + "graceful-fs": "4.1.11", + "normalize-package-data": "2.4.0", + "npm-package-arg": "5.1.2", + "npmlog": "4.1.2", + "once": "1.4.0", + "request": "2.83.0", + "retry": "0.10.1", + "semver": "5.5.0", + "slide": "1.1.6", + "ssri": "4.1.6" + }, + "dependencies": { + "concat-stream": { + "version": "1.6.0", + "bundled": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.4", + "typedarray": "0.0.6" + }, + "dependencies": { + "typedarray": { + "version": "0.0.6", + "bundled": true + } + } + }, + "npm-package-arg": { + "version": "5.1.2", + "bundled": true, + "requires": { + "hosted-git-info": "2.5.0", + "osenv": "0.1.5", + "semver": "5.5.0", + "validate-npm-package-name": "3.0.0" + } + }, + "ssri": { + "version": "4.1.6", + "bundled": true, + "requires": { + "safe-buffer": "5.1.1" + } + } + } + }, + "npm-user-validate": { + "version": "1.0.0", + "bundled": true + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + }, + "dependencies": { + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.4" + }, + "dependencies": { + "delegates": { + "version": "1.0.0", + "bundled": true + } + } + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "requires": { + "aproba": "1.2.0", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + }, + "dependencies": { + "object-assign": { + "version": "4.1.1", + "bundled": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "1.0.1" + }, + "dependencies": { + "number-is-nan": { + "version": "1.0.1", + "bundled": true + } + } + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "bundled": true + } + } + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "requires": { + "string-width": "1.0.2" + } + } + } + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true + } + } + }, + "once": { + "version": "1.4.0", + "bundled": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "opener": { + "version": "1.4.3", + "bundled": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + }, + "dependencies": { + "os-homedir": { + "version": "1.0.2", + "bundled": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true + } + } + }, + "pacote": { + "version": "7.3.3", + "bundled": true, + "requires": { + "bluebird": "3.5.1", + "cacache": "10.0.4", + "get-stream": "3.0.0", + "glob": "7.1.2", + "lru-cache": "4.1.1", + "make-fetch-happen": "2.6.0", + "minimatch": "3.0.4", + "mississippi": "2.0.0", + "normalize-package-data": "2.4.0", + "npm-package-arg": "6.0.0", + "npm-packlist": "1.1.10", + "npm-pick-manifest": "2.1.0", + "osenv": "0.1.5", + "promise-inflight": "1.0.1", + "promise-retry": "1.1.1", + "protoduck": "5.0.0", + "safe-buffer": "5.1.1", + "semver": "5.5.0", + "ssri": "5.2.4", + "tar": "4.3.3", + "unique-filename": "1.1.0", + "which": "1.3.0" + }, + "dependencies": { + "get-stream": { + "version": "3.0.0", + "bundled": true + }, + "make-fetch-happen": { + "version": "2.6.0", + "bundled": true, + "requires": { + "agentkeepalive": "3.3.0", + "cacache": "10.0.4", + "http-cache-semantics": "3.8.1", + "http-proxy-agent": "2.0.0", + "https-proxy-agent": "2.1.1", + "lru-cache": "4.1.1", + "mississippi": "1.3.1", + "node-fetch-npm": "2.0.2", + "promise-retry": "1.1.1", + "socks-proxy-agent": "3.0.1", + "ssri": "5.2.4" + }, + "dependencies": { + "agentkeepalive": { + "version": "3.3.0", + "bundled": true, + "requires": { + "humanize-ms": "1.2.1" + }, + "dependencies": { + "humanize-ms": { + "version": "1.2.1", + "bundled": true, + "requires": { + "ms": "2.1.1" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "bundled": true + } + } + } + } + }, + "http-cache-semantics": { + "version": "3.8.1", + "bundled": true + }, + "http-proxy-agent": { + "version": "2.0.0", + "bundled": true, + "requires": { + "agent-base": "4.2.0", + "debug": "2.6.9" + }, + "dependencies": { + "agent-base": { + "version": "4.2.0", + "bundled": true, + "requires": { + "es6-promisify": "5.0.0" + }, + "dependencies": { + "es6-promisify": { + "version": "5.0.0", + "bundled": true, + "requires": { + "es6-promise": "4.2.4" + }, + "dependencies": { + "es6-promise": { + "version": "4.2.4", + "bundled": true + } + } + } + } + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "bundled": true + } + } + } + } + }, + "https-proxy-agent": { + "version": "2.1.1", + "bundled": true, + "requires": { + "agent-base": "4.2.0", + "debug": "3.1.0" + }, + "dependencies": { + "agent-base": { + "version": "4.2.0", + "bundled": true, + "requires": { + "es6-promisify": "5.0.0" + }, + "dependencies": { + "es6-promisify": { + "version": "5.0.0", + "bundled": true, + "requires": { + "es6-promise": "4.2.4" + }, + "dependencies": { + "es6-promise": { + "version": "4.2.4", + "bundled": true + } + } + } + } + }, + "debug": { + "version": "3.1.0", + "bundled": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "bundled": true + } + } + } + } + }, + "mississippi": { + "version": "1.3.1", + "bundled": true, + "requires": { + "concat-stream": "1.6.0", + "duplexify": "3.5.3", + "end-of-stream": "1.4.1", + "flush-write-stream": "1.0.2", + "from2": "2.3.0", + "parallel-transform": "1.1.0", + "pump": "1.0.3", + "pumpify": "1.4.0", + "stream-each": "1.2.2", + "through2": "2.0.3" + }, + "dependencies": { + "concat-stream": { + "version": "1.6.0", + "bundled": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.4", + "typedarray": "0.0.6" + }, + "dependencies": { + "typedarray": { + "version": "0.0.6", + "bundled": true + } + } + }, + "duplexify": { + "version": "3.5.3", + "bundled": true, + "requires": { + "end-of-stream": "1.4.1", + "inherits": "2.0.3", + "readable-stream": "2.3.4", + "stream-shift": "1.0.0" + }, + "dependencies": { + "stream-shift": { + "version": "1.0.0", + "bundled": true + } + } + }, + "end-of-stream": { + "version": "1.4.1", + "bundled": true, + "requires": { + "once": "1.4.0" + } + }, + "flush-write-stream": { + "version": "1.0.2", + "bundled": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.4" + } + }, + "from2": { + "version": "2.3.0", + "bundled": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.4" + } + }, + "parallel-transform": { + "version": "1.1.0", + "bundled": true, + "requires": { + "cyclist": "0.2.2", + "inherits": "2.0.3", + "readable-stream": "2.3.4" + }, + "dependencies": { + "cyclist": { + "version": "0.2.2", + "bundled": true + } + } + }, + "pump": { + "version": "1.0.3", + "bundled": true, + "requires": { + "end-of-stream": "1.4.1", + "once": "1.4.0" + } + }, + "pumpify": { + "version": "1.4.0", + "bundled": true, + "requires": { + "duplexify": "3.5.3", + "inherits": "2.0.3", + "pump": "2.0.1" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "bundled": true, + "requires": { + "end-of-stream": "1.4.1", + "once": "1.4.0" + } + } + } + }, + "stream-each": { + "version": "1.2.2", + "bundled": true, + "requires": { + "end-of-stream": "1.4.1", + "stream-shift": "1.0.0" + }, + "dependencies": { + "stream-shift": { + "version": "1.0.0", + "bundled": true + } + } + }, + "through2": { + "version": "2.0.3", + "bundled": true, + "requires": { + "readable-stream": "2.3.4", + "xtend": "4.0.1" + }, + "dependencies": { + "xtend": { + "version": "4.0.1", + "bundled": true + } + } + } + } + }, + "node-fetch-npm": { + "version": "2.0.2", + "bundled": true, + "requires": { + "encoding": "0.1.12", + "json-parse-better-errors": "1.0.1", + "safe-buffer": "5.1.1" + }, + "dependencies": { + "encoding": { + "version": "0.1.12", + "bundled": true, + "requires": { + "iconv-lite": "0.4.19" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.19", + "bundled": true + } + } + }, + "json-parse-better-errors": { + "version": "1.0.1", + "bundled": true + } + } + }, + "socks-proxy-agent": { + "version": "3.0.1", + "bundled": true, + "requires": { + "agent-base": "4.2.0", + "socks": "1.1.10" + }, + "dependencies": { + "agent-base": { + "version": "4.2.0", + "bundled": true, + "requires": { + "es6-promisify": "5.0.0" + }, + "dependencies": { + "es6-promisify": { + "version": "5.0.0", + "bundled": true, + "requires": { + "es6-promise": "4.2.4" + }, + "dependencies": { + "es6-promise": { + "version": "4.2.4", + "bundled": true + } + } + } + } + }, + "socks": { + "version": "1.1.10", + "bundled": true, + "requires": { + "ip": "1.1.5", + "smart-buffer": "1.1.15" + }, + "dependencies": { + "ip": { + "version": "1.1.5", + "bundled": true + }, + "smart-buffer": { + "version": "1.1.15", + "bundled": true + } + } + } + } + } + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "1.1.11" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "1.0.0", + "bundled": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + } + } + } + } + }, + "mississippi": { + "version": "2.0.0", + "bundled": true, + "requires": { + "concat-stream": "1.6.0", + "duplexify": "3.5.3", + "end-of-stream": "1.4.1", + "flush-write-stream": "1.0.2", + "from2": "2.3.0", + "parallel-transform": "1.1.0", + "pump": "2.0.1", + "pumpify": "1.4.0", + "stream-each": "1.2.2", + "through2": "2.0.3" + }, + "dependencies": { + "concat-stream": { + "version": "1.6.0", + "bundled": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.4", + "typedarray": "0.0.6" + }, + "dependencies": { + "typedarray": { + "version": "0.0.6", + "bundled": true + } + } + }, + "duplexify": { + "version": "3.5.3", + "bundled": true, + "requires": { + "end-of-stream": "1.4.1", + "inherits": "2.0.3", + "readable-stream": "2.3.4", + "stream-shift": "1.0.0" + }, + "dependencies": { + "stream-shift": { + "version": "1.0.0", + "bundled": true + } + } + }, + "end-of-stream": { + "version": "1.4.1", + "bundled": true, + "requires": { + "once": "1.4.0" + } + }, + "flush-write-stream": { + "version": "1.0.2", + "bundled": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.4" + } + }, + "from2": { + "version": "2.3.0", + "bundled": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.4" + } + }, + "parallel-transform": { + "version": "1.1.0", + "bundled": true, + "requires": { + "cyclist": "0.2.2", + "inherits": "2.0.3", + "readable-stream": "2.3.4" + }, + "dependencies": { + "cyclist": { + "version": "0.2.2", + "bundled": true + } + } + }, + "pump": { + "version": "2.0.1", + "bundled": true, + "requires": { + "end-of-stream": "1.4.1", + "once": "1.4.0" + } + }, + "pumpify": { + "version": "1.4.0", + "bundled": true, + "requires": { + "duplexify": "3.5.3", + "inherits": "2.0.3", + "pump": "2.0.1" + } + }, + "stream-each": { + "version": "1.2.2", + "bundled": true, + "requires": { + "end-of-stream": "1.4.1", + "stream-shift": "1.0.0" + }, + "dependencies": { + "stream-shift": { + "version": "1.0.0", + "bundled": true + } + } + }, + "through2": { + "version": "2.0.3", + "bundled": true, + "requires": { + "readable-stream": "2.3.4", + "xtend": "4.0.1" + }, + "dependencies": { + "xtend": { + "version": "4.0.1", + "bundled": true + } + } + } + } + }, + "npm-pick-manifest": { + "version": "2.1.0", + "bundled": true, + "requires": { + "npm-package-arg": "6.0.0", + "semver": "5.5.0" + } + }, + "promise-retry": { + "version": "1.1.1", + "bundled": true, + "requires": { + "err-code": "1.1.2", + "retry": "0.10.1" + }, + "dependencies": { + "err-code": { + "version": "1.1.2", + "bundled": true + } + } + }, + "protoduck": { + "version": "5.0.0", + "bundled": true, + "requires": { + "genfun": "4.0.1" + }, + "dependencies": { + "genfun": { + "version": "4.0.1", + "bundled": true + } + } + }, + "semver": { + "version": "5.5.0", + "bundled": true + } + } + }, + "path-is-inside": { + "version": "1.0.2", + "bundled": true + }, + "promise-inflight": { + "version": "1.0.1", + "bundled": true + }, + "qrcode-terminal": { + "version": "0.11.0", + "bundled": true + }, + "query-string": { + "version": "5.1.0", + "bundled": true, + "requires": { + "decode-uri-component": "0.2.0", + "object-assign": "4.1.1", + "strict-uri-encode": "1.1.0" + }, + "dependencies": { + "decode-uri-component": { + "version": "0.2.0", + "bundled": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true + }, + "strict-uri-encode": { + "version": "1.1.0", + "bundled": true + } + } + }, + "qw": { + "version": "1.0.1", + "bundled": true + }, + "read": { + "version": "1.0.7", + "bundled": true, + "requires": { + "mute-stream": "0.0.7" + }, + "dependencies": { + "mute-stream": { + "version": "0.0.7", + "bundled": true + } + } + }, + "read-cmd-shim": { + "version": "1.0.1", + "bundled": true, + "requires": { + "graceful-fs": "4.1.11" + } + }, + "read-installed": { + "version": "4.0.3", + "bundled": true, + "requires": { + "debuglog": "1.0.1", + "graceful-fs": "4.1.11", + "read-package-json": "2.0.12", + "readdir-scoped-modules": "1.0.2", + "semver": "5.5.0", + "slide": "1.1.6", + "util-extend": "1.0.3" + }, + "dependencies": { + "util-extend": { + "version": "1.0.3", + "bundled": true + } + } + }, + "read-package-json": { + "version": "2.0.12", + "bundled": true, + "requires": { + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "json-parse-better-errors": "1.0.1", + "normalize-package-data": "2.4.0", + "slash": "1.0.0" + }, + "dependencies": { + "json-parse-better-errors": { + "version": "1.0.1", + "bundled": true + }, + "slash": { + "version": "1.0.0", + "bundled": true + } + } + }, + "read-package-tree": { + "version": "5.1.6", + "bundled": true, + "requires": { + "debuglog": "1.0.1", + "dezalgo": "1.0.3", + "once": "1.4.0", + "read-package-json": "2.0.12", + "readdir-scoped-modules": "1.0.2" + } + }, + "readable-stream": { + "version": "2.3.4", + "bundled": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "bundled": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true + }, + "string_decoder": { + "version": "1.0.3", + "bundled": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true + } + } + }, + "readdir-scoped-modules": { + "version": "1.0.2", + "bundled": true, + "requires": { + "debuglog": "1.0.1", + "dezalgo": "1.0.3", + "graceful-fs": "4.1.11", + "once": "1.4.0" + } + }, + "request": { + "version": "2.83.0", + "bundled": true, + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.3.1", + "har-validator": "5.0.3", + "hawk": "6.0.2", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.1", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.6.0", + "uuid": "3.2.1" + }, + "dependencies": { + "aws-sign2": { + "version": "0.7.0", + "bundled": true + }, + "aws4": { + "version": "1.6.0", + "bundled": true + }, + "caseless": { + "version": "0.12.0", + "bundled": true + }, + "combined-stream": { + "version": "1.0.5", + "bundled": true, + "requires": { + "delayed-stream": "1.0.0" + }, + "dependencies": { + "delayed-stream": { + "version": "1.0.0", + "bundled": true + } + } + }, + "extend": { + "version": "3.0.1", + "bundled": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true + }, + "form-data": { + "version": "2.3.1", + "bundled": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + }, + "dependencies": { + "asynckit": { + "version": "0.4.0", + "bundled": true + } + } + }, + "har-validator": { + "version": "5.0.3", + "bundled": true, + "requires": { + "ajv": "5.2.3", + "har-schema": "2.0.0" + }, + "dependencies": { + "ajv": { + "version": "5.2.3", + "bundled": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "json-schema-traverse": "0.3.1", + "json-stable-stringify": "1.0.1" + }, + "dependencies": { + "co": { + "version": "4.6.0", + "bundled": true + }, + "fast-deep-equal": { + "version": "1.0.0", + "bundled": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "bundled": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "bundled": true, + "requires": { + "jsonify": "0.0.0" + }, + "dependencies": { + "jsonify": { + "version": "0.0.0", + "bundled": true + } + } + } + } + }, + "har-schema": { + "version": "2.0.0", + "bundled": true + } + } + }, + "hawk": { + "version": "6.0.2", + "bundled": true, + "requires": { + "boom": "4.3.1", + "cryptiles": "3.1.2", + "hoek": "4.2.0", + "sntp": "2.0.2" + }, + "dependencies": { + "boom": { + "version": "4.3.1", + "bundled": true, + "requires": { + "hoek": "4.2.0" + } + }, + "cryptiles": { + "version": "3.1.2", + "bundled": true, + "requires": { + "boom": "5.2.0" + }, + "dependencies": { + "boom": { + "version": "5.2.0", + "bundled": true, + "requires": { + "hoek": "4.2.0" + } + } + } + }, + "hoek": { + "version": "4.2.0", + "bundled": true + }, + "sntp": { + "version": "2.0.2", + "bundled": true, + "requires": { + "hoek": "4.2.0" + } + } + } + }, + "http-signature": { + "version": "1.2.0", + "bundled": true, + "requires": { + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true + }, + "jsprim": { + "version": "1.4.1", + "bundled": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + }, + "dependencies": { + "extsprintf": { + "version": "1.3.0", + "bundled": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true + }, + "verror": { + "version": "1.10.0", + "bundled": true, + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "bundled": true + } + } + } + } + }, + "sshpk": { + "version": "1.13.1", + "bundled": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "asn1": { + "version": "0.2.3", + "bundled": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "bundled": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.1", + "bundled": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "optional": true + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "optional": true + } + } + } + } + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true + }, + "mime-types": { + "version": "2.1.17", + "bundled": true, + "requires": { + "mime-db": "1.30.0" + }, + "dependencies": { + "mime-db": { + "version": "1.30.0", + "bundled": true + } + } + }, + "oauth-sign": { + "version": "0.8.2", + "bundled": true + }, + "performance-now": { + "version": "2.1.0", + "bundled": true + }, + "qs": { + "version": "6.5.1", + "bundled": true + }, + "stringstream": { + "version": "0.0.5", + "bundled": true + }, + "tough-cookie": { + "version": "2.3.3", + "bundled": true, + "requires": { + "punycode": "1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "bundled": true + } + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "requires": { + "safe-buffer": "5.1.1" + } + } + } + }, + "retry": { + "version": "0.10.1", + "bundled": true + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true + }, + "semver": { + "version": "5.5.0", + "bundled": true + }, + "sha": { + "version": "2.0.1", + "bundled": true, + "requires": { + "graceful-fs": "4.1.11", + "readable-stream": "2.3.4" + } + }, + "slide": { + "version": "1.1.6", + "bundled": true + }, + "sorted-object": { + "version": "2.0.1", + "bundled": true + }, + "sorted-union-stream": { + "version": "2.1.3", + "bundled": true, + "requires": { + "from2": "1.3.0", + "stream-iterate": "1.2.0" + }, + "dependencies": { + "from2": { + "version": "1.3.0", + "bundled": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "1.1.14" + }, + "dependencies": { + "readable-stream": { + "version": "1.1.14", + "bundled": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "bundled": true + }, + "isarray": { + "version": "0.0.1", + "bundled": true + }, + "string_decoder": { + "version": "0.10.31", + "bundled": true + } + } + } + } + }, + "stream-iterate": { + "version": "1.2.0", + "bundled": true, + "requires": { + "readable-stream": "2.3.4", + "stream-shift": "1.0.0" + }, + "dependencies": { + "stream-shift": { + "version": "1.0.0", + "bundled": true + } + } + } + } + }, + "ssri": { + "version": "5.2.4", + "bundled": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "strip-ansi": { + "version": "4.0.0", + "bundled": true, + "requires": { + "ansi-regex": "3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "bundled": true + } + } + }, + "tar": { + "version": "4.3.3", + "bundled": true, + "requires": { + "chownr": "1.0.1", + "fs-minipass": "1.2.5", + "minipass": "2.2.1", + "minizlib": "1.1.0", + "mkdirp": "0.5.1", + "yallist": "3.0.2" + }, + "dependencies": { + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "requires": { + "minipass": "2.2.1" + } + }, + "minipass": { + "version": "2.2.1", + "bundled": true, + "requires": { + "yallist": "3.0.2" + } + }, + "minizlib": { + "version": "1.1.0", + "bundled": true, + "requires": { + "minipass": "2.2.1" + } + }, + "yallist": { + "version": "3.0.2", + "bundled": true + } + } + }, + "text-table": { + "version": "0.2.0", + "bundled": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true + }, + "umask": { + "version": "1.1.0", + "bundled": true + }, + "unique-filename": { + "version": "1.1.0", + "bundled": true, + "requires": { + "unique-slug": "2.0.0" + }, + "dependencies": { + "unique-slug": { + "version": "2.0.0", + "bundled": true, + "requires": { + "imurmurhash": "0.1.4" + } + } + } + }, + "unpipe": { + "version": "1.0.0", + "bundled": true + }, + "update-notifier": { + "version": "2.3.0", + "bundled": true, + "requires": { + "boxen": "1.2.1", + "chalk": "2.1.0", + "configstore": "3.1.1", + "import-lazy": "2.1.0", + "is-installed-globally": "0.1.0", + "is-npm": "1.0.0", + "latest-version": "3.1.0", + "semver-diff": "2.1.0", + "xdg-basedir": "3.0.0" + }, + "dependencies": { + "boxen": { + "version": "1.2.1", + "bundled": true, + "requires": { + "ansi-align": "2.0.0", + "camelcase": "4.1.0", + "chalk": "2.1.0", + "cli-boxes": "1.0.0", + "string-width": "2.1.1", + "term-size": "1.2.0", + "widest-line": "1.0.0" + }, + "dependencies": { + "ansi-align": { + "version": "2.0.0", + "bundled": true, + "requires": { + "string-width": "2.1.1" + } + }, + "camelcase": { + "version": "4.1.0", + "bundled": true + }, + "cli-boxes": { + "version": "1.0.0", + "bundled": true + }, + "string-width": { + "version": "2.1.1", + "bundled": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "bundled": true + } + } + }, + "term-size": { + "version": "1.2.0", + "bundled": true, + "requires": { + "execa": "0.7.0" + }, + "dependencies": { + "execa": { + "version": "0.7.0", + "bundled": true, + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "bundled": true, + "requires": { + "lru-cache": "4.1.1", + "shebang-command": "1.2.0", + "which": "1.3.0" + }, + "dependencies": { + "shebang-command": { + "version": "1.2.0", + "bundled": true, + "requires": { + "shebang-regex": "1.0.0" + }, + "dependencies": { + "shebang-regex": { + "version": "1.0.0", + "bundled": true + } + } + } + } + }, + "get-stream": { + "version": "3.0.0", + "bundled": true + }, + "is-stream": { + "version": "1.1.0", + "bundled": true + }, + "npm-run-path": { + "version": "2.0.2", + "bundled": true, + "requires": { + "path-key": "2.0.1" + }, + "dependencies": { + "path-key": { + "version": "2.0.1", + "bundled": true + } + } + }, + "p-finally": { + "version": "1.0.0", + "bundled": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true + }, + "strip-eof": { + "version": "1.0.0", + "bundled": true + } + } + } + } + }, + "widest-line": { + "version": "1.0.0", + "bundled": true, + "requires": { + "string-width": "1.0.2" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "1.0.1" + }, + "dependencies": { + "number-is-nan": { + "version": "1.0.1", + "bundled": true + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "bundled": true + } + } + } + } + } + } + } + } + }, + "chalk": { + "version": "2.1.0", + "bundled": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.4.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.0", + "bundled": true, + "requires": { + "color-convert": "1.9.0" + }, + "dependencies": { + "color-convert": { + "version": "1.9.0", + "bundled": true, + "requires": { + "color-name": "1.1.3" + }, + "dependencies": { + "color-name": { + "version": "1.1.3", + "bundled": true + } + } + } + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "bundled": true + }, + "supports-color": { + "version": "4.4.0", + "bundled": true, + "requires": { + "has-flag": "2.0.0" + }, + "dependencies": { + "has-flag": { + "version": "2.0.0", + "bundled": true + } + } + } + } + }, + "configstore": { + "version": "3.1.1", + "bundled": true, + "requires": { + "dot-prop": "4.2.0", + "graceful-fs": "4.1.11", + "make-dir": "1.0.0", + "unique-string": "1.0.0", + "write-file-atomic": "2.1.0", + "xdg-basedir": "3.0.0" + }, + "dependencies": { + "dot-prop": { + "version": "4.2.0", + "bundled": true, + "requires": { + "is-obj": "1.0.1" + }, + "dependencies": { + "is-obj": { + "version": "1.0.1", + "bundled": true + } + } + }, + "make-dir": { + "version": "1.0.0", + "bundled": true, + "requires": { + "pify": "2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "bundled": true + } + } + }, + "unique-string": { + "version": "1.0.0", + "bundled": true, + "requires": { + "crypto-random-string": "1.0.0" + }, + "dependencies": { + "crypto-random-string": { + "version": "1.0.0", + "bundled": true + } + } + } + } + }, + "import-lazy": { + "version": "2.1.0", + "bundled": true + }, + "is-installed-globally": { + "version": "0.1.0", + "bundled": true, + "requires": { + "global-dirs": "0.1.0", + "is-path-inside": "1.0.0" + }, + "dependencies": { + "global-dirs": { + "version": "0.1.0", + "bundled": true, + "requires": { + "ini": "1.3.5" + } + }, + "is-path-inside": { + "version": "1.0.0", + "bundled": true, + "requires": { + "path-is-inside": "1.0.2" + } + } + } + }, + "is-npm": { + "version": "1.0.0", + "bundled": true + }, + "latest-version": { + "version": "3.1.0", + "bundled": true, + "requires": { + "package-json": "4.0.1" + }, + "dependencies": { + "package-json": { + "version": "4.0.1", + "bundled": true, + "requires": { + "got": "6.7.1", + "registry-auth-token": "3.3.1", + "registry-url": "3.1.0", + "semver": "5.5.0" + }, + "dependencies": { + "got": { + "version": "6.7.1", + "bundled": true, + "requires": { + "create-error-class": "3.0.2", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-redirect": "1.0.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "lowercase-keys": "1.0.0", + "safe-buffer": "5.1.1", + "timed-out": "4.0.1", + "unzip-response": "2.0.1", + "url-parse-lax": "1.0.0" + }, + "dependencies": { + "create-error-class": { + "version": "3.0.2", + "bundled": true, + "requires": { + "capture-stack-trace": "1.0.0" + }, + "dependencies": { + "capture-stack-trace": { + "version": "1.0.0", + "bundled": true + } + } + }, + "duplexer3": { + "version": "0.1.4", + "bundled": true + }, + "get-stream": { + "version": "3.0.0", + "bundled": true + }, + "is-redirect": { + "version": "1.0.0", + "bundled": true + }, + "is-retry-allowed": { + "version": "1.1.0", + "bundled": true + }, + "is-stream": { + "version": "1.1.0", + "bundled": true + }, + "lowercase-keys": { + "version": "1.0.0", + "bundled": true + }, + "timed-out": { + "version": "4.0.1", + "bundled": true + }, + "unzip-response": { + "version": "2.0.1", + "bundled": true + }, + "url-parse-lax": { + "version": "1.0.0", + "bundled": true, + "requires": { + "prepend-http": "1.0.4" + }, + "dependencies": { + "prepend-http": { + "version": "1.0.4", + "bundled": true + } + } + } + } + }, + "registry-auth-token": { + "version": "3.3.1", + "bundled": true, + "requires": { + "rc": "1.2.1", + "safe-buffer": "5.1.1" + }, + "dependencies": { + "rc": { + "version": "1.2.1", + "bundled": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "deep-extend": { + "version": "0.4.2", + "bundled": true + }, + "minimist": { + "version": "1.2.0", + "bundled": true + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true + } + } + } + } + }, + "registry-url": { + "version": "3.1.0", + "bundled": true, + "requires": { + "rc": "1.2.1" + }, + "dependencies": { + "rc": { + "version": "1.2.1", + "bundled": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "deep-extend": { + "version": "0.4.2", + "bundled": true + }, + "minimist": { + "version": "1.2.0", + "bundled": true + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true + } + } + } + } + } + } + } + } + }, + "semver-diff": { + "version": "2.1.0", + "bundled": true, + "requires": { + "semver": "5.5.0" + } + }, + "xdg-basedir": { + "version": "3.0.0", + "bundled": true + } + } + }, + "uuid": { + "version": "3.2.1", + "bundled": true + }, + "validate-npm-package-license": { + "version": "3.0.1", + "bundled": true, + "requires": { + "spdx-correct": "1.0.2", + "spdx-expression-parse": "1.0.4" + }, + "dependencies": { + "spdx-correct": { + "version": "1.0.2", + "bundled": true, + "requires": { + "spdx-license-ids": "1.2.2" + }, + "dependencies": { + "spdx-license-ids": { + "version": "1.2.2", + "bundled": true + } + } + }, + "spdx-expression-parse": { + "version": "1.0.4", + "bundled": true + } + } + }, + "validate-npm-package-name": { + "version": "3.0.0", + "bundled": true, + "requires": { + "builtins": "1.0.3" + }, + "dependencies": { + "builtins": { + "version": "1.0.3", + "bundled": true + } + } + }, + "which": { + "version": "1.3.0", + "bundled": true, + "requires": { + "isexe": "2.0.0" + }, + "dependencies": { + "isexe": { + "version": "2.0.0", + "bundled": true + } + } + }, + "worker-farm": { + "version": "1.5.2", + "bundled": true, + "requires": { + "errno": "0.1.7", + "xtend": "4.0.1" + }, + "dependencies": { + "errno": { + "version": "0.1.7", + "bundled": true, + "requires": { + "prr": "1.0.1" + }, + "dependencies": { + "prr": { + "version": "1.0.1", + "bundled": true + } + } + }, + "xtend": { + "version": "4.0.1", + "bundled": true + } + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true + }, + "write-file-atomic": { + "version": "2.1.0", + "bundled": true, + "requires": { + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "slide": "1.1.6" + } + } + } + }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", diff --git a/RaftPackAngular/package.json b/RaftPackAngular/package.json index 7e0702a..c63f3d4 100644 --- a/RaftPackAngular/package.json +++ b/RaftPackAngular/package.json @@ -28,6 +28,8 @@ "core-js": "^2.4.1", "cors": "^2.8.4", "install": "^0.10.4", + "ng-file-upload": "^12.2.13", + "npm": "^5.7.1", "rxjs": "^5.5.6", "zone.js": "^0.8.19" }, diff --git a/RaftPackAngular/src/app/app-routing.module.ts b/RaftPackAngular/src/app/app-routing.module.ts index ed45db7..bb3c8ab 100644 --- a/RaftPackAngular/src/app/app-routing.module.ts +++ b/RaftPackAngular/src/app/app-routing.module.ts @@ -7,15 +7,23 @@ import { ModifyUserInfoComponent } from './modify-user-info/modify-user-info.com import { ProfileComponent } from './profile/profile.component'; import { PostComponent } from './post/post.component'; import { DashboardComponent } from './dashboard/dashboard.component'; +import { FriendProfileComponent } from './friend-profile/friend-profile.component'; + + + export const routes: Routes = [ { path: '', component: LoginComponent }, { path: 'login', component: LoginComponent }, - { path: 'register', component : RegisterComponent}, + { path: 'login/register', component : RegisterComponent}, { path: 'modify-user-info', component : ModifyUserInfoComponent}, { path: 'profile', component : ProfileComponent}, + { path: 'profile/:id', component : ProfileComponent}, { path: 'post', component : PostComponent}, - { path: 'dashboard', component : DashboardComponent} + { path: 'dashboard', component : DashboardComponent}, + { path: 'friend-profile', component : FriendProfileComponent}, + { path: 'register', component : RegisterComponent}, + ]; @NgModule({ diff --git a/RaftPackAngular/src/app/app.component.ts b/RaftPackAngular/src/app/app.component.ts index d3ffce0..8a76c1b 100644 --- a/RaftPackAngular/src/app/app.component.ts +++ b/RaftPackAngular/src/app/app.component.ts @@ -7,5 +7,5 @@ import { Component } from '@angular/core'; }) export class AppComponent { title = 'RaftPack'; - isLoggedIn: boolean; + isLoggedIn = false; } diff --git a/RaftPackAngular/src/app/app.module.ts b/RaftPackAngular/src/app/app.module.ts index e588ca7..c7ed175 100644 --- a/RaftPackAngular/src/app/app.module.ts +++ b/RaftPackAngular/src/app/app.module.ts @@ -8,7 +8,8 @@ import { LoginComponent } from './login/login.component'; import { LoginService } from './services/login.service'; import { HttpModule } from '@angular/http'; import { NavbarComponent } from './navbar/navbar.component'; - +import { FormdataUploadComponent } from './form-data-upload/form-data-upload.component'; +import {ReactiveFormsModule} from '@angular/forms'; import { ModifyUserInfoComponent } from './modify-user-info/modify-user-info.component'; import { AppRoutingModule } from './app-routing.module'; @@ -27,6 +28,9 @@ import { ModifyUserService } from './services/modify-user.service'; import { PostService } from './services/post.service'; import { DashboardComponent } from './dashboard/dashboard.component'; import { FeedComponent } from './feed/feed.component'; +import { FriendProfileComponent } from './friend-profile/friend-profile.component'; +import { SearchComponent } from './search/search.component'; +import { SearchService } from './services/search.service'; @NgModule({ declarations: [ @@ -40,16 +44,21 @@ import { FeedComponent } from './feed/feed.component'; PostDetailsComponent, NavbarComponent, DashboardComponent, - FeedComponent + FeedComponent, + FriendProfileComponent, + SearchComponent, + FormdataUploadComponent ], imports: [ BrowserModule, FormsModule, AppRoutingModule, HttpModule, - HttpClientModule + HttpClientModule, + ReactiveFormsModule ], - providers: [ProfileService, MessageService, LoginService, RegisterService, UploadFileService, ModifyUserService, PostService], + providers: [ProfileService, MessageService, LoginService, RegisterService, UploadFileService, ModifyUserService, PostService, + SearchService, PostComponent], bootstrap: [AppComponent] }) export class AppModule { } diff --git a/RaftPackAngular/src/app/dashboard/dashboard.component.html b/RaftPackAngular/src/app/dashboard/dashboard.component.html index 1436a7d..dff9f9f 100644 --- a/RaftPackAngular/src/app/dashboard/dashboard.component.html +++ b/RaftPackAngular/src/app/dashboard/dashboard.component.html @@ -1,9 +1,9 @@
- +
-Post: +

Feed:

diff --git a/RaftPackAngular/src/app/feed/feed.component.html b/RaftPackAngular/src/app/feed/feed.component.html index 33f6dc6..4b1feeb 100644 --- a/RaftPackAngular/src/app/feed/feed.component.html +++ b/RaftPackAngular/src/app/feed/feed.component.html @@ -1,6 +1,6 @@
  • {{post.message}} {{post.user.first_name}} - {{post.user.last_name}} {{post.date}} + {{post.user.last_name}} {{post.date}}
  • diff --git a/RaftPackAngular/src/app/form-data-upload/form-data-upload.component.css b/RaftPackAngular/src/app/form-data-upload/form-data-upload.component.css new file mode 100644 index 0000000..e69de29 diff --git a/RaftPackAngular/src/app/form-data-upload/form-data-upload.component.html b/RaftPackAngular/src/app/form-data-upload/form-data-upload.component.html new file mode 100644 index 0000000..cc1955d --- /dev/null +++ b/RaftPackAngular/src/app/form-data-upload/form-data-upload.component.html @@ -0,0 +1,11 @@ +
    + + + + + + + +
    +
    + \ No newline at end of file diff --git a/RaftPackAngular/src/app/form-data-upload/form-data-upload.component.ts b/RaftPackAngular/src/app/form-data-upload/form-data-upload.component.ts new file mode 100644 index 0000000..b34ff6f --- /dev/null +++ b/RaftPackAngular/src/app/form-data-upload/form-data-upload.component.ts @@ -0,0 +1,74 @@ +import { Component, ElementRef, ViewChild } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { UploadFileService } from './../services/upload.service'; +import { PostService } from '../services/post.service'; +import { Post } from '../models/post.model'; +import { ProfileService } from './../services/profile.service'; +import { User } from '../models/user.model'; +import { PostComponent } from './../post/post.component'; + +@Component({ + selector: 'app-form-data-upload', + templateUrl: './form-data-upload.component.html' +}) +export class FormdataUploadComponent { + form: FormGroup; + loading = false; + file: any; + uid: any; + post = new Post(0, '', '', 0, null, null); + user = new User(0, '', '', '', '', '', '', '', ''); + @ViewChild('fileInput') fileInput: ElementRef; + + constructor(private fb: FormBuilder, private uploadFileService: UploadFileService, private postService: PostService, + private profileService: ProfileService, private postComponent: PostComponent) { + this.createForm(); + } + + createForm() { + this.form = this.fb.group({ + message: ['', Validators.required], + image: null + }); + } + + onFileChange(event) { + if (event.target.files.length > 0) { + this.file = event.target.files[0]; + this.form.get('image').setValue(this.file); + } + } + + private prepareSave(): any { + const input = new FormData(); + input.append('message', this.form.get('message').value); + input.append('image', this.form.get('image').value); + return input; + } + + onSubmit() { + const formModel = this.prepareSave(); + this.loading = true; + this.uploadFileService.uploadfile(this.file).subscribe(image => {this.post.image = image; + this.profileService.getProfile(parseInt(document.cookie, 10)).subscribe(user => { + this.post.user = user; + console.log(this.post); + this.post.message = this.form.get('message').value; + console.log(this.post); + this.postComponent.createPost(this.post.message, this.post.image); + console.log(this.post); + }); + }); + + setTimeout(() => { + alert('done!'); + this.loading = false; + }, 1000); + } + + clearFile() { + this.form.get('image').setValue(null); + this.fileInput.nativeElement.value = ''; + } + +} diff --git a/RaftPackAngular/src/app/friend-profile/friend-profile.component.css b/RaftPackAngular/src/app/friend-profile/friend-profile.component.css new file mode 100644 index 0000000..e69de29 diff --git a/RaftPackAngular/src/app/friend-profile/friend-profile.component.html b/RaftPackAngular/src/app/friend-profile/friend-profile.component.html new file mode 100644 index 0000000..781ec62 --- /dev/null +++ b/RaftPackAngular/src/app/friend-profile/friend-profile.component.html @@ -0,0 +1,16 @@ +
    + +
    + +
    + Name: {{user.first_name}} {{user.last_name}} +

    + Gender: {{user.gender}} +

    + Birthday: {{user.date_of_birth}}

    + Email: {{user.user_email}}

    + Bio: {{user.biography}}

    + +
    + +
    diff --git a/RaftPackAngular/src/app/friend-profile/friend-profile.component.spec.ts b/RaftPackAngular/src/app/friend-profile/friend-profile.component.spec.ts new file mode 100644 index 0000000..d17e858 --- /dev/null +++ b/RaftPackAngular/src/app/friend-profile/friend-profile.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { FriendProfileComponent } from './friend-profile.component'; + +describe('FriendProfileComponent', () => { + let component: FriendProfileComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ FriendProfileComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(FriendProfileComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/RaftPackAngular/src/app/friend-profile/friend-profile.component.ts b/RaftPackAngular/src/app/friend-profile/friend-profile.component.ts new file mode 100644 index 0000000..2f7cb94 --- /dev/null +++ b/RaftPackAngular/src/app/friend-profile/friend-profile.component.ts @@ -0,0 +1,35 @@ +import { Message } from './../models/message.model'; +import { Component, OnInit } from '@angular/core'; +import { ProfileService } from '../services/profile.service'; +import { User } from '../models/user.model'; + + +@Component({ + selector: 'app-friend-profile', + templateUrl: './friend-profile.component.html', + styleUrls: ['./friend-profile.component.css'] +}) +export class FriendProfileComponent implements OnInit { + + user = new User(0, '', '', '', '', '', '', '', ''); + + constructor(private profileService: ProfileService ) { + } + + public message: Message = new Message('No profile to display.'); + + getProfile() { + this.profileService.getProfile(1).subscribe( + user => { + this.user = user; + console.log(this.user); + console.log(document.cookie = this.user.userId.valueOf().toString()); + }, + error => this.message.text = `Couldn't find Profile.`); + } + + ngOnInit(): void { + this.getProfile(); + } + +} diff --git a/RaftPackAngular/src/app/login/login.component.ts b/RaftPackAngular/src/app/login/login.component.ts index eddd7dd..1dc398d 100644 --- a/RaftPackAngular/src/app/login/login.component.ts +++ b/RaftPackAngular/src/app/login/login.component.ts @@ -41,6 +41,7 @@ export class LoginComponent implements OnInit { } ngOnInit() { + document.cookie = null; } } diff --git a/RaftPackAngular/src/app/modify-user-info/modify-user-info.component.html b/RaftPackAngular/src/app/modify-user-info/modify-user-info.component.html index 0172d59..3fa205b 100644 --- a/RaftPackAngular/src/app/modify-user-info/modify-user-info.component.html +++ b/RaftPackAngular/src/app/modify-user-info/modify-user-info.component.html @@ -1,44 +1,38 @@ - - - - - +

    Edit Profile

    - +
    - - - +
    Upload a different photo...
    - - +
    - - + - + - + -
    - -
    - +
    + +
    + -
    - -
    +
    + +
    - + -

    Enter your Date of Birth

    - - -
    -
    - -
    \ No newline at end of file +

    Enter your Date of Birth

    + + +
    +
    + +
    +
    +
    +
    diff --git a/RaftPackAngular/src/app/navbar/navbar.component.css b/RaftPackAngular/src/app/navbar/navbar.component.css index e69de29..df8b784 100644 --- a/RaftPackAngular/src/app/navbar/navbar.component.css +++ b/RaftPackAngular/src/app/navbar/navbar.component.css @@ -0,0 +1,42 @@ + #nav { + /*position: fixed;*/ + } + + .search-result li { + border-bottom: 1px solid gray; + border-left: 1px solid gray; + border-right: 1px solid gray; + width: 200px; + height: 30px; + padding: 5px; + background-color: white; + cursor: pointer; + list-style-type: none; + position: absolute; + } + + .search-result li:hover { + background-color: #607D8B; + } + + .search-result li a { + color: #888; + display: block; + text-decoration: none; + } + + .search-result li a:hover { + color: white; + } + .search-result li a:active { + color: white; + } + #search-box { + width: 200px; + } + + + ul.search-result { + margin-top: 0; + padding-left: 0; + } \ No newline at end of file diff --git a/RaftPackAngular/src/app/navbar/navbar.component.html b/RaftPackAngular/src/app/navbar/navbar.component.html index 4c88d09..9112f09 100644 --- a/RaftPackAngular/src/app/navbar/navbar.component.html +++ b/RaftPackAngular/src/app/navbar/navbar.component.html @@ -1,4 +1,4 @@ -
    diff --git a/RaftPackAngular/src/app/navbar/navbar.component.ts b/RaftPackAngular/src/app/navbar/navbar.component.ts index 8e29f4e..8b00fd3 100644 --- a/RaftPackAngular/src/app/navbar/navbar.component.ts +++ b/RaftPackAngular/src/app/navbar/navbar.component.ts @@ -1,4 +1,11 @@ import { Component, OnInit } from '@angular/core'; +import { Observable } from 'rxjs/Observable'; +import { User } from '../models/user.model'; +import { Subject } from 'rxjs/Subject'; +import { SearchService } from '../services/search.service'; +import { debounceTime } from 'rxjs/operator/debounceTime'; +import { distinctUntilChanged } from 'rxjs/operator/distinctUntilChanged'; +import { switchMap } from 'rxjs/operator/switchMap'; @Component({ selector: 'app-navbar', @@ -7,9 +14,26 @@ import { Component, OnInit } from '@angular/core'; }) export class NavbarComponent implements OnInit { - constructor() { } + users$: Observable; + private searchTerms = new Subject(); - ngOnInit() { + constructor(private searchService: SearchService) {} + + // Push a search term into the observable stream. + search(term: string): void { + this.searchTerms.next(term); + } + + ngOnInit(): void { + this.users$ = this.searchTerms. + // wait 300ms after each keystroke before considering the term + debounceTime(300). + + // ignore new term if same as previous term + distinctUntilChanged(). + + // switch to new search observable each time the term changes + switchMap((term: string) => this.searchService.searchUsers(term)); } } diff --git a/RaftPackAngular/src/app/post/post.component.html b/RaftPackAngular/src/app/post/post.component.html index 5ff57bf..8321d74 100644 --- a/RaftPackAngular/src/app/post/post.component.html +++ b/RaftPackAngular/src/app/post/post.component.html @@ -1,5 +1,5 @@ - - + +
    Your Posts:
  • {{post.message}} -{{post.date}}
  • +{{post.date}}
    diff --git a/RaftPackAngular/src/app/post/post.component.ts b/RaftPackAngular/src/app/post/post.component.ts index a17a132..0f984ea 100644 --- a/RaftPackAngular/src/app/post/post.component.ts +++ b/RaftPackAngular/src/app/post/post.component.ts @@ -7,7 +7,7 @@ import { User } from '../models/user.model'; import { PostService } from '../services/post.service'; import { Message } from '../models/message.model'; import { UploadFileService } from '../services/upload.service'; - +import { FormdataUploadComponent } from './../form-data-upload/form-data-upload.component'; @Component({ selector: 'app-post', templateUrl: './post.component.html', @@ -17,6 +17,7 @@ export class PostComponent implements OnInit { public posts: Post[] = []; post = new Post(0, '', null, 0, null, null); userId: number; + url: string; selectedFiles: FileList; postImage: string; message: Message; @@ -30,9 +31,9 @@ export class PostComponent implements OnInit { this.userService.getProfile(parseInt(document.cookie, 10)).subscribe(user => this.user = user); } - createPost(postText: string) { - - this.post = { postId: 0, message: postText, image: this.post.image, numOfLikes: 0, user: this.user, date: null }; + createPost(postText: string, postImage: string) { + this.url = 'https://s3.amazonaws.com/jsa-angular-bucket/jsa-s3/' + postImage + '.png'; + this.post = { postId: 0, message: postText, image: this.url, numOfLikes: 0, user: this.user, date: null }; this.postService.createPost(this.post).subscribe(message => { this.message = message; console.log(message); }); @@ -43,6 +44,7 @@ export class PostComponent implements OnInit { posts => { this.posts = posts; console.log(posts); }); + } diff --git a/RaftPackAngular/src/app/profile-detail/profile-detail.component.css b/RaftPackAngular/src/app/profile-detail/profile-detail.component.css new file mode 100644 index 0000000..e69de29 diff --git a/RaftPackAngular/src/app/profile-detail/profile-detail.component.html b/RaftPackAngular/src/app/profile-detail/profile-detail.component.html new file mode 100644 index 0000000..a19e1da --- /dev/null +++ b/RaftPackAngular/src/app/profile-detail/profile-detail.component.html @@ -0,0 +1,21 @@ + \ No newline at end of file diff --git a/RaftPackAngular/src/app/profile-detail/profile-detail.component.spec.ts b/RaftPackAngular/src/app/profile-detail/profile-detail.component.spec.ts new file mode 100644 index 0000000..7294f6d --- /dev/null +++ b/RaftPackAngular/src/app/profile-detail/profile-detail.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ProfileDetailComponent } from './profile-detail.component'; + +describe('ProfileDetailComponent', () => { + let component: ProfileDetailComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ProfileDetailComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ProfileDetailComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/RaftPackAngular/src/app/profile-detail/profile-detail.component.ts b/RaftPackAngular/src/app/profile-detail/profile-detail.component.ts new file mode 100644 index 0000000..9a3614e --- /dev/null +++ b/RaftPackAngular/src/app/profile-detail/profile-detail.component.ts @@ -0,0 +1,24 @@ +import { Component, OnInit, Input } from '@angular/core'; +import { Profile } from '../models/profile.model'; +import { ActivatedRoute } from '@angular/router'; +import { ProfileService } from '../services/profile.service'; + +@Component({ + selector: 'app-profile-detail', + templateUrl: './profile-detail.component.html', + styleUrls: ['./profile-detail.component.css'] +}) +export class ProfileDetailComponent implements OnInit { + constructor() { } + + ngOnInit() { + this.getProfile(); + } + + getProfile(): void { + } + + save(): void { + } + +} diff --git a/RaftPackAngular/src/app/profile/profile.component.html b/RaftPackAngular/src/app/profile/profile.component.html index 6e1ec73..0d6fb06 100644 --- a/RaftPackAngular/src/app/profile/profile.component.html +++ b/RaftPackAngular/src/app/profile/profile.component.html @@ -9,6 +9,13 @@ Birthday: {{user.date_of_birth}}

    Email: {{user.user_email}}

    Bio: {{user.biography}}
    + +
    +
    + + Friend Page +

    +



    diff --git a/RaftPackAngular/src/app/profile/profile.component.ts b/RaftPackAngular/src/app/profile/profile.component.ts index b3a5bc8..04933f3 100644 --- a/RaftPackAngular/src/app/profile/profile.component.ts +++ b/RaftPackAngular/src/app/profile/profile.component.ts @@ -7,6 +7,7 @@ import { UploadFileService } from '../services/upload.service'; import { FileUpload } from '../models/file-upload'; import { Observable } from 'rxjs/Observable'; import { ModifyUserService } from '../services/modify-user.service'; +import { ActivatedRoute } from '@angular/router'; @Component({ selector: 'app-profile', templateUrl: './profile.component.html', @@ -19,21 +20,31 @@ export class ProfileComponent implements OnInit { fileUploads: Observable>; user = new User(0, '', '', '', '', '', '', '', document.cookie); imageString: string; - // loginComponent: LoginComponent; - constructor(private profileService: ProfileService, private uploadService: UploadFileService, - private modifyUserService: ModifyUserService) { - } + + constructor( + private profileService: ProfileService, + private uploadService: UploadFileService, + private route: ActivatedRoute, + private modifyUserService: ModifyUserService) { } public message: Message = new Message('No profile to display.'); getProfile() { - this.profileService.getProfile(parseInt(document.cookie, 10)).subscribe( - user => { - this.user = user; - console.log(this.user); - console.log(document.cookie = this.user.userId.valueOf().toString()); - }, - error => this.message.text = `Couldn't find Profile.`); + const id = +this.route.snapshot.paramMap.get('id'); + if (id) { + this.profileService.getProfile(id).subscribe( + user => this.user = user, + error => this.message.text = `Couldn't find Profile.` + ); + } else { + this.profileService.getProfile(parseInt(document.cookie, 10)).subscribe( + user => { + this.user = user; + console.log(this.user); + console.log(document.cookie = this.user.userId.valueOf().toString()); + }, + error => this.message.text = `Couldn't find Profile.`); + } } ngOnInit(): void { @@ -42,14 +53,13 @@ export class ProfileComponent implements OnInit { upload() { const file = this.selectedFiles.item(0); - this.user.profile_image = this.uploadService.uploadfile(file); + this.uploadService.uploadfile(file).subscribe(profile_image => this.user.profile_image = profile_image); console.log(this.user); this.imageString = 'https://s3.amazonaws.com/jsa-angular-bucket/jsa-s3/' + this.user.profile_image + '.png'; this.user.profile_image = this.imageString; this.modifyUserService.update(this.user).subscribe(user => this.user = user); } - selectFile(event) { this.selectedFiles = event.target.files; } diff --git a/RaftPackAngular/src/app/search/search.component.css b/RaftPackAngular/src/app/search/search.component.css new file mode 100644 index 0000000..e69de29 diff --git a/RaftPackAngular/src/app/search/search.component.html b/RaftPackAngular/src/app/search/search.component.html new file mode 100644 index 0000000..2536349 --- /dev/null +++ b/RaftPackAngular/src/app/search/search.component.html @@ -0,0 +1,3 @@ +

    + search works! +

    diff --git a/RaftPackAngular/src/app/search/search.component.spec.ts b/RaftPackAngular/src/app/search/search.component.spec.ts new file mode 100644 index 0000000..4372919 --- /dev/null +++ b/RaftPackAngular/src/app/search/search.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SearchComponent } from './search.component'; + +describe('SearchComponent', () => { + let component: SearchComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SearchComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SearchComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/RaftPackAngular/src/app/search/search.component.ts b/RaftPackAngular/src/app/search/search.component.ts new file mode 100644 index 0000000..47b6260 --- /dev/null +++ b/RaftPackAngular/src/app/search/search.component.ts @@ -0,0 +1,40 @@ +import { Component, OnInit } from '@angular/core'; +import { SearchService } from '../services/search.service'; +import { Observable } from 'rxjs/Observable'; +import { User } from '../models/user.model'; +import { Subject } from 'rxjs'; +import { debounceTime } from 'rxjs/operator/debounceTime'; +import { distinctUntilChanged } from 'rxjs/operator/distinctUntilChanged'; +import { switchMap } from 'rxjs/operator/switchMap'; + +@Component({ + selector: 'app-search', + templateUrl: './search.component.html', + styleUrls: ['./search.component.css'] +}) +export class SearchComponent implements OnInit { + + users$: Observable; + private searchTerms = new Subject(); + + constructor(private searchService: SearchService) {} + + // Push a search term into the observable stream. + search(term: string): void { + this.searchTerms.next(term); + } + + ngOnInit(): void { + this.users$ = this.searchTerms. + // wait 300ms after each keystroke before considering the term + debounceTime(300). + + // ignore new term if same as previous term + distinctUntilChanged(). + + // switch to new search observable each time the term changes + switchMap((term: string) => this.searchService.searchUsers(term) + ); + } + +} diff --git a/RaftPackAngular/src/app/services/login.service.spec.ts b/RaftPackAngular/src/app/services/login.service.spec.ts deleted file mode 100644 index 1ec7154..0000000 --- a/RaftPackAngular/src/app/services/login.service.spec.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { TestBed, inject } from '@angular/core/testing'; - -import { LoginService } from './login.service'; - -describe('LoginService', () => { - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [LoginService] - }); - }); - - it('should be created', inject([LoginService], (service: LoginService) => { - expect(service).toBeTruthy(); - })); -}); diff --git a/RaftPackAngular/src/app/services/login.service.ts b/RaftPackAngular/src/app/services/login.service.ts index 043e011..5b7f170 100644 --- a/RaftPackAngular/src/app/services/login.service.ts +++ b/RaftPackAngular/src/app/services/login.service.ts @@ -21,6 +21,7 @@ export class LoginService { return this.http .post(`http://localhost:8090/RaftPackSpring/login.app`, body, options) .map((response: Response) => { + console.log(body); return response.json(); }) .catch(this.handleError); diff --git a/RaftPackAngular/src/app/services/post.service.ts b/RaftPackAngular/src/app/services/post.service.ts index bef8a4f..ed5d004 100644 --- a/RaftPackAngular/src/app/services/post.service.ts +++ b/RaftPackAngular/src/app/services/post.service.ts @@ -38,8 +38,18 @@ export class PostService { .catch(this.handleError); } + public getImage(post: Post): Observable { + const headers: Headers = new Headers({ 'Content-Type': 'application/json' }); + const options: RequestOptions = new RequestOptions({ headers: headers }); + + return this.httpc + .get(`http://localhost:8090/RaftPackSpring/getImage.app`, httpOptions) + .catch(this.handleError); + } + public createPost(post: Post): Observable { const body: string = JSON.stringify(post); + console.log(body); return this.httpc.post(`http://localhost:8090/RaftPackSpring/createPost.app`, body, httpOptions) .catch(this.handleError); } diff --git a/RaftPackAngular/src/app/services/search.service.ts b/RaftPackAngular/src/app/services/search.service.ts new file mode 100644 index 0000000..3947952 --- /dev/null +++ b/RaftPackAngular/src/app/services/search.service.ts @@ -0,0 +1,51 @@ +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs/Observable'; +import { User } from '../models/user.model'; +import { of } from 'rxjs/observable/of'; +import { catchError, tap } from 'rxjs/operators'; +import { HttpClient } from '@angular/common/http'; + +@Injectable() +export class SearchService { + + private users: User[]; + + constructor(private http: HttpClient) { } + + searchUsers(term: string): Observable { + if (!term.trim()) { + // if not search term, return empty hero array. + return of([]); + } + return this.http.get(`http://localhost:8090/RaftPackSpring/getUsersByFirstName.app?firstName=${term}`).pipe( + tap(_ => console.log(`found users matching "${term}"`)), + catchError(this.handleError('searchUsers', [])) + ); + } + + private handleError (operation = 'operation', result?: T) { + return (error: any): Observable => { + + // TODO: send the error to remote logging infrastructure + console.error(error); // log to console instead + + // Let the app keep running by returning an empty result. + return of(result as T); + }; + } + + /*search(terms: Observable) { + return terms.debounceTime(400) + .distinctUntilChanged() + .switchMap(term => this.searchEntries(term)); + } + + searchEntries(term) { + return this.http + .get(`http://localhost:9005/RaftPackSpring/getPosts.app?firstName=` + term) + .map((response: Response) => { + return response.json(); + }); + }*/ + +} diff --git a/RaftPackAngular/src/app/services/upload.service.ts b/RaftPackAngular/src/app/services/upload.service.ts index a76fd4c..7bf689b 100644 --- a/RaftPackAngular/src/app/services/upload.service.ts +++ b/RaftPackAngular/src/app/services/upload.service.ts @@ -24,7 +24,7 @@ export class UploadFileService { return bucket; } - uploadfile(file): string { + uploadfile(file): Observable { const uid = uuid(); const params = { Bucket: this.BUCKET, @@ -42,7 +42,7 @@ export class UploadFileService { console.log('Successfully uploaded file.', data); return true; }); - return uid; + return Observable.of(uid); } getFiles(): Observable> { diff --git a/RaftPackSpring/.classpath b/RaftPackSpring/.classpath index 89059ef..045b85d 100644 --- a/RaftPackSpring/.classpath +++ b/RaftPackSpring/.classpath @@ -6,38 +6,33 @@ - + - - + + - - - - - - - - + - + - + + + diff --git a/RaftPackSpring/.springBeans b/RaftPackSpring/.springBeans index acacbc5..b60db9d 100644 --- a/RaftPackSpring/.springBeans +++ b/RaftPackSpring/.springBeans @@ -7,8 +7,8 @@ - src/main/webapp/WEB-INF/applicationContext.xml src/main/webapp/WEB-INF/dispatcher-servlet.xml + src/main/resources/applicationContext.xml diff --git a/RaftPackSpring/src/main/java/com/revature/Main.java b/RaftPackSpring/src/main/java/com/revature/Main.java index 03bc836..a991a4f 100644 --- a/RaftPackSpring/src/main/java/com/revature/Main.java +++ b/RaftPackSpring/src/main/java/com/revature/Main.java @@ -1,5 +1,6 @@ package com.revature; +import com.revature.model.User; import com.revature.repository.UserRepository; import com.revature.repository.UserRepositoryImpl; import com.revature.service.UserServiceImpl; @@ -7,8 +8,15 @@ public class Main { static UserRepository up = new UserRepositoryImpl(); public static void main(String[] args) { + UserServiceImpl usl = new UserServiceImpl(up); - System.out.println(up.findByUserEmail("mnguyen5081@gmail.com").getfirst_name()); + + User me = new User("Demarques", "Glass", "cortez.glass@yahoo.com" , "123", "male", "1994-10-19"); + + System.out.println(me); + + usl.registerUser(me); +// System.out.println(up.findByUserEmail("cortez.glass@yahoo.com").getfirst_name()); } } diff --git a/RaftPackSpring/src/main/java/com/revature/controller/ModifyUserController.java b/RaftPackSpring/src/main/java/com/revature/controller/ModifyUserController.java new file mode 100644 index 0000000..723efa4 --- /dev/null +++ b/RaftPackSpring/src/main/java/com/revature/controller/ModifyUserController.java @@ -0,0 +1,28 @@ +package com.revature.controller; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import com.revature.pojo.ModifyUser; +import com.revature.pojo.Message; +//import com.revature.service.ModifyuserService; +import com.revature.model.User; + +/*@Controller("modifyUserController") +@CrossOrigin(origins = "http://localhost:4200")// This have no time to validate +public class ModifyUserController { + @Autowired + private ModifyuserService moduserService; + + //@RequestMapping(value="/registerHero.app", method=RequestMethod.POST) + @PostMapping("/modifyUser.app") + public @ResponseBody ResponseEntity modifyUser(@RequestBody User moduser) { + moduserService.modifyUser(moduser); + return new ResponseEntity<>(new Message("USER MODIFIED SUCCESSFULLY..."), HttpStatus.OK); + } +}*/ diff --git a/RaftPackSpring/src/main/java/com/revature/controller/PostController.java b/RaftPackSpring/src/main/java/com/revature/controller/PostController.java new file mode 100644 index 0000000..e69de29 diff --git a/RaftPackSpring/src/main/java/com/revature/controller/UserController.java b/RaftPackSpring/src/main/java/com/revature/controller/UserController.java index 289469b..ff0f1e9 100644 --- a/RaftPackSpring/src/main/java/com/revature/controller/UserController.java +++ b/RaftPackSpring/src/main/java/com/revature/controller/UserController.java @@ -1,25 +1,26 @@ package com.revature.controller; +import java.util.ArrayList; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; +import com.revature.model.Image; import com.revature.model.Post; import com.revature.model.User; import com.revature.pojo.Message; import com.revature.service.PostService; -import com.revature.service.PostServiceImpl; import com.revature.service.UserService; -@Controller("userController") +@RestController("userController") @CrossOrigin(origins = "http://localhost:4200") public class UserController { @@ -48,7 +49,7 @@ public class UserController { public @ResponseBody ResponseEntity getUser(@RequestBody String email) { return new ResponseEntity<>(userService.findUser(email), HttpStatus.OK); } - + @PostMapping("/getUser.app") public @ResponseBody ResponseEntity getUser(@RequestBody int userId) { return new ResponseEntity<>(userService.findUser(userId), HttpStatus.OK); @@ -61,7 +62,11 @@ public class UserController { @GetMapping("/getAllPosts.app") public @ResponseBody ResponseEntity> getAllPosts() { - return new ResponseEntity<>(ps.getAllPosts(), HttpStatus.OK); + List post = ps.getAllPosts(); + for(Post string: post ) { + System.out.println(string); + } + return new ResponseEntity<>(post, HttpStatus.OK); } @PostMapping("/createPost.app") @@ -80,5 +85,10 @@ public class UserController { return new ResponseEntity<>(userService.updateUser(user), HttpStatus.OK); } + + @GetMapping("/getImage.app") + public @ResponseBody ResponseEntity getImage(@RequestBody Post post){ + return new ResponseEntity<>(ps.getImage(post.getPostId()), HttpStatus.OK); + } } diff --git a/RaftPackSpring/src/main/java/com/revature/model/Image.java b/RaftPackSpring/src/main/java/com/revature/model/Image.java index eecb9ec..f727694 100644 --- a/RaftPackSpring/src/main/java/com/revature/model/Image.java +++ b/RaftPackSpring/src/main/java/com/revature/model/Image.java @@ -32,9 +32,8 @@ public Image() { super(); } - public Image(int imageId, String image) { + public Image(String image) { super(); - this.imageId = imageId; this.image = image; } diff --git a/RaftPackSpring/src/main/java/com/revature/model/Post.java b/RaftPackSpring/src/main/java/com/revature/model/Post.java index 28cb514..e4c8a24 100644 --- a/RaftPackSpring/src/main/java/com/revature/model/Post.java +++ b/RaftPackSpring/src/main/java/com/revature/model/Post.java @@ -14,6 +14,7 @@ import javax.persistence.ManyToMany; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; +import javax.persistence.ManyToMany; import javax.persistence.SequenceGenerator; import javax.persistence.Table; @@ -41,21 +42,31 @@ public class Post { @Column(name="DATE_SUBMITTED") private Date date; - @OneToMany(mappedBy="post", fetch = FetchType.EAGER) - @Fetch(value = FetchMode.SUBSELECT) - @JsonIgnore - private List images; - - @OneToMany(mappedBy="post") - @Fetch(value = FetchMode.SUBSELECT) - @JsonIgnore - private List comments; + @Column(name="IMAGE") + private String image; +// @OneToMany(mappedBy="post", fetch = FetchType.EAGER) +// @Fetch(value = FetchMode.SUBSELECT) +// @JsonIgnore +// private List images; + + //@OneToMany(mappedBy="post", fetch = FetchType.EAGER) + //@Fetch(value = FetchMode.SUBSELECT) + //@JsonIgnore + //private List comments; + public String getImage() { + return image; + } + + public void setImage(String image) { + this.image = image; + } + @ManyToOne(cascade = CascadeType.ALL) @JoinColumn(name="USER_ID") private User user; - @ManyToMany(mappedBy="likedPosts") + @ManyToMany(mappedBy="likedPosts", fetch = FetchType.EAGER) @Fetch(value = FetchMode.SUBSELECT) @JsonIgnore private List likers; @@ -70,11 +81,11 @@ public void setDate(Date date) { this.date = date; } - public Post(int postId, String message, List images, int numOfLikes, User user) { + public Post(int postId, String message, String image, int numOfLikes, User user) { super(); this.postId = postId; this.message = message; - this.images = images; + this.image = image; this.numOfLikes = numOfLikes; this.user = user; } @@ -95,13 +106,6 @@ public void setMessage(String message) { this.message = message; } - public List getImages() { - return images; - } - - public void setImages(List images) { - this.images = images; - } public int getNumOfLikes() { return numOfLikes; @@ -121,12 +125,12 @@ public void setUser(User user) { @Override public String toString() { - return "Post [postId=" + postId + ", message=" + message + ", images=" + images + ", numOfLikes=" + numOfLikes + return "Post [postId=" + postId + ", message=" + message + ", image=" + image + ", numOfLikes=" + numOfLikes + ", user=" + user + "]"; } public String toStringTwo() { - return "Post [postId=" + postId + ", message=" + message + ", image=" + images + ", numOfLikes=" + numOfLikes + return "Post [postId=" + postId + ", message=" + message + ", image=" + image + ", numOfLikes=" + numOfLikes + ", user=" + user.toStringTwo() + "]"; } @@ -134,7 +138,7 @@ public String toStringTwo() { public int hashCode() { final int prime = 31; int result = 1; - result = prime * result + ((images == null) ? 0 : images.hashCode()); + result = prime * result + ((image == null) ? 0 : image.hashCode()); result = prime * result + ((message == null) ? 0 : message.hashCode()); result = prime * result + numOfLikes; result = prime * result + postId; @@ -151,10 +155,10 @@ public boolean equals(Object obj) { if (getClass() != obj.getClass()) return false; Post other = (Post) obj; - if (images == null) { - if (other.images != null) + if (image == null) { + if (other.image != null) return false; - } else if (!images.equals(other.images)) + } else if (!image.equals(other.image)) return false; if (message == null) { if (other.message != null) diff --git a/RaftPackSpring/src/main/java/com/revature/model/User.java b/RaftPackSpring/src/main/java/com/revature/model/User.java index a2c56b4..0e74051 100644 --- a/RaftPackSpring/src/main/java/com/revature/model/User.java +++ b/RaftPackSpring/src/main/java/com/revature/model/User.java @@ -77,12 +77,12 @@ public void setProfile_image(String profile_image) { this.profile_image = profile_image; } - @OneToMany(mappedBy="user") - @Fetch(value = FetchMode.SUBSELECT) - @JsonIgnore - private List myComments; + //@OneToMany(mappedBy="user") + //@Fetch(value = FetchMode.SUBSELECT) + //@JsonIgnore + //private List myComments; - @ManyToMany(cascade=CascadeType.ALL) + @ManyToMany(cascade=CascadeType.ALL, fetch = FetchType.EAGER) @Fetch(value = FetchMode.SUBSELECT) @JsonIgnore @JoinTable(name="USERS_FRIENDS", @@ -96,7 +96,7 @@ public void setProfile_image(String profile_image) { @JsonIgnore private List others; - @ManyToMany(cascade=CascadeType.ALL) + @ManyToMany(cascade=CascadeType.ALL, fetch = FetchType.EAGER) @Fetch(value = FetchMode.SUBSELECT) @JsonIgnore @JoinTable(name="LIKED_POSTS", @@ -111,6 +111,15 @@ public User(String user_email, String user_password) { this.user_email = user_email; this.user_password = user_password; } + + + + public User(int userId, String first_name, String last_name) { + super(); + this.userId = userId; + this.first_name = first_name; + this.last_name = last_name; + } public User(String first_name, String last_name, String user_email, String user_password, String gender, String date_of_birth) { @@ -122,9 +131,24 @@ public User(String first_name, String last_name, String user_email, String user_ this.date_of_birth = date_of_birth; this.gender = gender; } + + + public User(String first_name, String last_name, String user_email, String user_password, String gender, + String date_of_birth, String biography, String profile_image) { + super(); + this.first_name = first_name; + this.last_name = last_name; + this.user_email = user_email; + this.user_password = user_password; + this.gender = gender; + this.date_of_birth = date_of_birth; + this.biography = biography; + this.profile_image = profile_image; + } + public User(int userId, String first_name, String last_name, String user_email, String user_password, String gender, String date_of_birth, List myPosts, List friends, List likedPosts) { super(); @@ -230,10 +254,13 @@ public List printFriends(List friends) { @Override public String toString() { - return "User [userEmail=" + user_email + ", user_password=" + user_password + ", first_name=" - + first_name + ", last_name=" + last_name + ", dateOfBirth=" + date_of_birth + ", gender=" + gender - + ", profile="+"]"; + return "User [userId=" + userId + ", first_name=" + first_name + ", last_name=" + last_name + ", user_email=" + + user_email + ", user_password=" + user_password + ", gender=" + gender + ", date_of_birth=" + + date_of_birth + ", biography=" + biography + ", profile_image=" + profile_image + ", friends=" + + friends + "]"; } + + public String toStringTwo() { return "User [userId=" + userId + ", userEmail=" + user_email + ", user_password=" + user_password + ", first_name=" diff --git a/RaftPackSpring/src/main/java/com/revature/pojo/ModifyUser.java b/RaftPackSpring/src/main/java/com/revature/pojo/ModifyUser.java new file mode 100644 index 0000000..88e1a25 --- /dev/null +++ b/RaftPackSpring/src/main/java/com/revature/pojo/ModifyUser.java @@ -0,0 +1,83 @@ +package com.revature.pojo; + +public class ModifyUser { + private int userId; + private String profileImage; + private String firstname; + private String lastname; + private String useremail; + private String gender; + private String biography; + + public ModifyUser(int userId, String profileImage, String firstname, String lastname, String useremail, + String gender, String biography) { + super(); + this.userId = userId; + this.profileImage = profileImage; + this.firstname = firstname; + this.lastname = lastname; + this.useremail = useremail; + this.gender = gender; + this.biography = biography; + } + + public ModifyUser() { + } + + public int getUserId() { + return userId; + } + + public void setUserId(int userId) { + this.userId = userId; + } + + public String getProfileImage() { + return profileImage; + } + + public void setProfileImage(String profileImage) { + this.profileImage = profileImage; + } + + public String getFirstname() { + return firstname; + } + + public void setFirstname(String firstname) { + this.firstname = firstname; + } + + public String getLastname() { + return lastname; + } + + public void setLastname(String lastname) { + this.lastname = lastname; + } + + public String getUseremail() { + return useremail; + } + + public void setUseremail(String useremail) { + this.useremail = useremail; + } + + public String getGender() { + return gender; + } + + public void setGender(String gender) { + this.gender = gender; + } + + public String getBiography() { + return biography; + } + + public void setBiography(String biography) { + this.biography = biography; + } + +} diff --git a/RaftPackSpring/src/main/java/com/revature/repository/UserRepositoryImpl.java b/RaftPackSpring/src/main/java/com/revature/repository/UserRepositoryImpl.java index f330f6f..6477c33 100644 --- a/RaftPackSpring/src/main/java/com/revature/repository/UserRepositoryImpl.java +++ b/RaftPackSpring/src/main/java/com/revature/repository/UserRepositoryImpl.java @@ -35,6 +35,7 @@ public List findAll() { @Override public User findByUserId(int userId) { + System.out.println(userId); User u = (User)sessionFactory.getCurrentSession().get(User.class, userId); System.out.println(u); return u; @@ -43,7 +44,10 @@ public User findByUserId(int userId) { @Override public List findPostByUserId(int userId){ User u = (User)sessionFactory.getCurrentSession().get(User.class, userId); - return u.getMyPosts(); + if (u != null) + return u.getMyPosts(); + else + return null; } @Override @@ -67,7 +71,7 @@ public User findByUserEmail(String user_email) { public List findByFirstName(String first_name) { try { return sessionFactory.getCurrentSession().createCriteria(User.class) - .add(Restrictions.like("first_name", first_name)) + .add(Restrictions.like("first_name", "%" + first_name + "%")) .list(); } catch (IndexOutOfBoundsException e) { return null; diff --git a/RaftPackSpring/src/main/java/com/revature/service/EmailService.java b/RaftPackSpring/src/main/java/com/revature/service/EmailService.java new file mode 100644 index 0000000..55f8942 --- /dev/null +++ b/RaftPackSpring/src/main/java/com/revature/service/EmailService.java @@ -0,0 +1,26 @@ +package com.revature.service; + +/*import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.mail.MailSender; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.stereotype.Service; + +@Service +public class EmailService { + @Autowired + private MailSender mailSender; + + public void send(String from, String to, String subject, String message) { + sendEmail(from, to, subject, message); + } + + private void sendEmail(String from, String to, String subject, String message) { + SimpleMailMessage mailMessage = new SimpleMailMessage(); + mailMessage.setFrom(from); + mailMessage.setTo(to); + mailMessage.setSubject(subject); + mailMessage.setText(message); + mailSender.send(mailMessage); + } +}*/ \ No newline at end of file diff --git a/RaftPackSpring/src/main/java/com/revature/service/ModifyUserServiceImpl.java b/RaftPackSpring/src/main/java/com/revature/service/ModifyUserServiceImpl.java new file mode 100644 index 0000000..b3ebb73 --- /dev/null +++ b/RaftPackSpring/src/main/java/com/revature/service/ModifyUserServiceImpl.java @@ -0,0 +1,21 @@ +package com.revature.service; +import org.springframework.beans.factory.annotation.Autowired; + +import com.revature.model.User; +import com.revature.repository.UserRepository; + +/* +public class ModifyUserServiceImpl implements ModifyuserService{ + + @Autowired + private UserRepository userRepository; + + public ModifyUserServiceImpl(UserRepository userRepository) { + this.userRepository = userRepository; + } + + public void modifyUser(User user) { + userRepository.update(user); + } + +}*/ diff --git a/RaftPackSpring/src/main/java/com/revature/service/PostService.java b/RaftPackSpring/src/main/java/com/revature/service/PostService.java index fc2130e..e38d15d 100644 --- a/RaftPackSpring/src/main/java/com/revature/service/PostService.java +++ b/RaftPackSpring/src/main/java/com/revature/service/PostService.java @@ -8,4 +8,5 @@ public interface PostService { public void createPost(Post post); public List getAllPosts(); public Post updatePost(Post post); +public String getImage(int postId); } diff --git a/RaftPackSpring/src/main/java/com/revature/service/PostServiceImpl.java b/RaftPackSpring/src/main/java/com/revature/service/PostServiceImpl.java index 57a0ee3..44fd00e 100644 --- a/RaftPackSpring/src/main/java/com/revature/service/PostServiceImpl.java +++ b/RaftPackSpring/src/main/java/com/revature/service/PostServiceImpl.java @@ -14,7 +14,7 @@ public class PostServiceImpl implements PostService { @Autowired - PostRepository pr = new PostRepositoryImpl(); + PostRepository pr; public void createPost(Post post) { java.util.Date utilDate = new java.util.Date(); @@ -35,4 +35,10 @@ public Post updatePost(Post post) { return pr.findByPostId(post.getPostId()); } + @Override + public String getImage(int postId) { + Post post = pr.findByPostId(postId); + return post.getImage(); + } + } diff --git a/RaftPackSpring/src/main/java/com/revature/service/UserServiceImpl.java b/RaftPackSpring/src/main/java/com/revature/service/UserServiceImpl.java index 95faa65..8b34cbc 100644 --- a/RaftPackSpring/src/main/java/com/revature/service/UserServiceImpl.java +++ b/RaftPackSpring/src/main/java/com/revature/service/UserServiceImpl.java @@ -17,6 +17,10 @@ public class UserServiceImpl implements UserService { @Autowired private UserRepository userRepository; + public UserServiceImpl() { + // TODO Auto-generated constructor stub + } + public UserServiceImpl(UserRepository userRepository) { System.out.println("Constructor Injection."); this.userRepository = userRepository; @@ -68,8 +72,6 @@ public User validateUser(User user) { return user; } - - @Override public List getPosts(int userId){ return userRepository.findPostByUserId(userId); @@ -81,5 +83,4 @@ public User updateUser(User user) { return userRepository.findByUserId(user.getUserId()); } - } diff --git a/RaftPackSpring/src/main/resources/applicationContext.xml b/RaftPackSpring/src/main/resources/applicationContext.xml new file mode 100644 index 0000000..987226e --- /dev/null +++ b/RaftPackSpring/src/main/resources/applicationContext.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + org.hibernate.dialect.Oracle10gDialect + true + create + + + + + + + + + + + + + + \ No newline at end of file diff --git a/RaftPackSpring/src/main/webapp/WEB-INF/applicationContext.xml b/RaftPackSpring/src/main/webapp/WEB-INF/applicationContext.xml index bd28aa7..6c82017 100644 --- a/RaftPackSpring/src/main/webapp/WEB-INF/applicationContext.xml +++ b/RaftPackSpring/src/main/webapp/WEB-INF/applicationContext.xml @@ -46,23 +46,21 @@ + + - - - + \ No newline at end of file diff --git a/RaftPackSpring/src/main/webapp/WEB-INF/lib/activation.jar b/RaftPackSpring/src/main/webapp/WEB-INF/lib/activation.jar new file mode 100644 index 0000000000000000000000000000000000000000..29a59a9ee1941ed9f37af8af68b2b16e12938b4d GIT binary patch literal 56290 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 - - RaftPackSpring - - index.html - - - - contextConfigLocation - /WEB-INF/applicationContext.xml - - - - - org.springframework.web.context.ContextLoaderListener - - - - dispatcher - org.springframework.web.servlet.DispatcherServlet - - - dispatcher - *.app - + + RaftPackSpring + + + contextConfigLocation + /WEB-INF/applicationContext.xml + + + + + org.springframework.web.context.ContextLoaderListener + + + + dispatcher + org.springframework.web.servlet.DispatcherServlet + + + dispatcher + *.app + + + + + org.springframework.web.util.Log4jConfigListener + - - - org.springframework.web.util.Log4jConfigListener - - \ No newline at end of file diff --git a/RaftPackSpring/src/test/java/com/revature/test/ControllerTests.java b/RaftPackSpring/src/test/java/com/revature/test/ControllerTests.java new file mode 100644 index 0000000..bcd0fbe --- /dev/null +++ b/RaftPackSpring/src/test/java/com/revature/test/ControllerTests.java @@ -0,0 +1,75 @@ +package com.revature.test; + +import static org.junit.Assert.*; + +import org.junit.BeforeClass; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.stereotype.Component; + +import com.revature.model.User; +import com.revature.service.UserService; +import com.revature.service.UserServiceImpl; + +@Component +public class ControllerTests { + + @Autowired + private static UserService userService; + + @BeforeClass + public static void before() { + ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); + userService = ac.getBean(UserService.class); + User me = new User("Demarques", "Glass", "cortez.glass@yahoo.com" , "123", "male", "1994-10-19"); + userService.registerUser(me); + } + + + //This is a test of the userService findUserBy Id and Email methods + //The two methods should return the same user object + @Test + public void test1() { + assertEquals(userService.findUser(1).getuser_email(), "cortez.glass@yahoo.com"); + + + //System.out.println(userService.findUser(0)); + + } + + + @Test + public void test2() { + assertEquals(userService.findUser("cortez.glass@yahoo.com").getuser_email(), "cortez.glass@yahoo.com"); + + + //System.out.println(userService.findUser(0)); + + } + + + //Test of getting a user by id and retrieving that user id + @Test + public void test3() { + assertEquals(userService.findUser(1).getUserId(), 1); + + + //System.out.println(userService.findUser(0)); + + } + + +// @Test +// public void test4() { +// assertEquals(userService.findUsersByFirstName("Demarques"), 1); +// +// +// //System.out.println(userService.findUser(0)); +// +// } + + + +} diff --git a/RaftPackSpring/src/test/java/com/revature/test/EmailServiceTest.java b/RaftPackSpring/src/test/java/com/revature/test/EmailServiceTest.java new file mode 100644 index 0000000..3f4e5d3 --- /dev/null +++ b/RaftPackSpring/src/test/java/com/revature/test/EmailServiceTest.java @@ -0,0 +1,38 @@ +package com.revature.test; +import static org.junit.Assert.assertNotNull; +import java.util.Date; +import org.junit.Ignore; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +//import com.revature.service.EmailService; + +//@ContextConfiguration("classpath:META-INF/spring/mydocuments-context.xml") +/*@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration("EmailService.class") +public class EmailServiceTest { + + private static final Logger log = LoggerFactory.getLogger(EmailService.class); + + @Autowired + EmailService email; + + @Test + public void testEmail() throws InterruptedException{ + System.out.println("after testemail"); + log.debug("Testing Email..."); + assertNotNull(email); + long start = new Date().getTime(); + email.send("damondantin@gmail.com", "damondantin@yahoo.com", "New Document Add", + "A new document was added to the collection."); + long end = new Date().getTime(); + long time = (end - start)/1000; + log.debug("Sending email done. Took: " + time + " seconds."); + } + }*/ + + diff --git a/RaftPackSpring/src/test/resources/applicationContext.xml b/RaftPackSpring/src/test/resources/applicationContext.xml new file mode 100644 index 0000000..987226e --- /dev/null +++ b/RaftPackSpring/src/test/resources/applicationContext.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + org.hibernate.dialect.Oracle10gDialect + true + create + + + + + + + + + + + + + + \ No newline at end of file diff --git a/RaftPackSpring/target/classes/com/revature/Main.class b/RaftPackSpring/target/classes/com/revature/Main.class index f994a1f570ee4a1edf9bd97bd2e49e5d0a949fdb..09a7cc532b3d19ae4023d78855e4b01862b974b6 100644 GIT binary patch delta 497 zcmb7=%T7~a6otQij?lk{dOHD9h)}AC#ojojUTVEyL6~4LF`6)NaBTimNZW&_M-!Rw z1djd(aO4BPz$TLL06u{er@n&|vwrBk7dOSM z*>k236mvp)P4~k1^&34HJn!-i5ECsM3yliUq+9YRig( zaHbb_wc@(q1&v0%94wWChQ|!04Cg2dQDJj8d>dA~VZT#-n#4Q(PV-c0{VV;iV)8Ps z(o_jjESV27;nr9-Lzz_`H@KDJra5u4t=lw&)SkVabo;`@-!E;w+|})*x%k{8OEbe= z?g^P#cXkGej-L&5ELEoaL7aGs1hJuOWAp&RZCNt=&uO_cfS<_`8zxVGlfG1=`S z&JUU1JZ5Iw&-r=(ihtF=<}VH@K0cyS`b52G;m)D;J6yCl$%w@aW45*&7g)fj$hbwA dJI&=j4=fua&k7F_>pM$}RhuBJjoOvNqhCgMZ<7E3 delta 363 zcmX9(%Sr-a6#o91VlG;udBaGv%QRMA)3Pj(sGYQl7U3d>8ixsI3Y`L1JwXfkcR>%( zQUjxc9-vK6(6+~jj>Lg;{m%ED^P_yr>gVs<2Y@p62I@VN6(lh)A;tSbL`-9WKM6@q z#u7usajl!4=~fEWV%>5KyPZ3~a(vLBOITsh`gLvAj|^5B0xjFU*zcWm&CcN%$&l4~ zn$55Ve`GPGreYmA30eNY5@kQ~C@@S}rq{ANUGK~_9FrleXBwBrt&wjVu9ZLbI<{-k zVhLpl8~jU%2P@cQkgjRqwOu-JED`1h;t_uqn@r|`iPD{f5PjzdBR`2SA`}%w5u=Vm zc@rW8im7+RPlpJ+Aki3NjecwM9 z#C-!1L_|a@YIyKT6a5`Nn)qfS-Wf_I(Zo#h&COlTJ?DHgql+gz@~2;KKLA*X_b=qR za+ewV(JA2oA-zf6troUxp>Uxu6x9@T;UFP3qy^ekt+kC{bGdzgdc5&`i5Z7+RKgKL z=HFEX$8emG)DqaM5wfNc!fH#fu)MA*kXEmiNH|Hbi%!{ICo`|p3W{)sknNh?3ULLsotahX@lm zQ8t1F%f@hu6K4rMli$X%raEr~n_j~=%+pD*@@YddpKBpw9Ts3ca`|0=jmY3^4rcLL zj7-eow~Xbuh)bXvZj^8t0w!GHf&%v3C|>308fUU#n&cx%0!jQ6Nc>^(GUB`K=CwBN zFyRKL!O$i+xZ7Ms43rlbIxwL|UstwM{IPLNTCF6jcQb2R<;uZ7DR#6?o79_SEoELj!+|p>*I2pZkMeTNbD=V34^c*>zcoG1AkfgacxE8j1i#`eiLf%Ed9sw-L-7EmX~90tFW7H{cQyS cBrz)K8n)bK>?TKK-)=N>u!D*WKirDDS21Q`XaE2J diff --git a/RaftPackSpring/target/classes/com/revature/model/Image.class b/RaftPackSpring/target/classes/com/revature/model/Image.class index a9881b60818e8fa220ee05edb1ab77d8cbdefddf..6039bc0f8c83a517dea97750c19e3bb0cdc552f4 100644 GIT binary patch delta 889 zcmZ8fO-~b16g@N3cFH&ksZfp9lqeOLDHM!Ftd>%WNDD0rf+C=;LRv&25#pA=VDc6w zZg8V+N+MB9f{8IMB=HZpBr&esyEUFSCDM?l?|#g=_nv#+dw%?v&-ng#=QDtdc(`S3 zs%lf4*ilc5J=Jg2K|!|(H$38xnlim>D-&x^7nh4VE{j<$(0WBdefmkExX?VaC{21k zZlD)&6K7#dFJYn|NwJ|>{*(f5xY>a@plkBekl52M#D*0pa}u60aS2fZONG@^YGr=G zKo(;Tn)yjQmwJ+F>zb9ZujRB~Z|b2+tPgq*Z9$)(3Qz z=~UZ!oMgMx#;gJ$Ha$Uq*TG1`Y2QIPJH<~=)E9ntsJvUe@-%5ZutidD^w*HBRz_Lb zBbM}Fo+5FEq%+1fB%RPF^iKO?+qf!uRnX@fs9=zOn8tUVM+ND_^I|o0L;G7Rj;z1+ zz(RNzy7rdhIZa0M@rGcaB)jM10lB#5=;$XYAi=1gUJ_?8z|3j|p)$EPFL%GWgp?s1fg`y2$0RgtGH5ZADZ2mb(+#)(P* delta 934 zcmZ8fO-~b16g@N3&XjQwGD2$vZKELVbZmvF2v`ah(ehDHq*xVcm0BaQ4`_{5)=P|D}RDZHJ;aL1lino?|tu_d)|5Phxz=F{`JqNEdXaQzplTP z6@NJGe3V;4UZ{1D5H}FOVF`MvSWZ7Gl#1zj2}(GUc7DpKj^^;#gTj+S{9$3K6rU*&FNfk9k!o+*}ph$uU>C`Kg2 z*09*R>})Gty=e*3tmuszIFGYDxKLPGNG;D7b!0H9VM0RVejNtJ(CKt}hSeDZH;{9l zdQSKA zxC)YHs)9?*V_eKD3>A#*AKq6r!Egy`CP-Dgx3tz`YzLb18oEm|o=-FeTNea-KG7;} zuT-t|Qxq`3YLMAQ97T%#p*{9SYRn3azgo4|OFOSIlQHEaeQgRK(z)*ot!ASYWM9Fn ztVO>-8W)3iVAx!?(X6bAS`-!Bd?5}AEv)UAqVViW>gVeLY04RahEW{gmFh9h_srl3 zCJ@AARmv%fh+_%~{-h+PF*kxNkIwATp85ARGPsRdIu#`34!;Yvb4Wc@&1?KZlLo25 XU~`U58F|hXe@I4w>s`VcS8(qylHiVz diff --git a/RaftPackSpring/target/classes/com/revature/model/Post.class b/RaftPackSpring/target/classes/com/revature/model/Post.class index 4a8b7e628ae5e3273ddd44b5d94bf86424b1f7e5..c3789fbcbeb812e9eb5eb9fa0ab684b9ff36bc15 100644 GIT binary patch literal 4463 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 literal 8481 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 H;l2L?yVfIs diff --git a/RaftPackSpring/target/classes/com/revature/repository/UserRepositoryImpl.class b/RaftPackSpring/target/classes/com/revature/repository/UserRepositoryImpl.class index 08d11ddba734b058b73101bec7ccef34f75aec8b..0054e2a549a7f42e9453188717960a134bdcb0fc 100644 GIT binary patch delta 1704 zcma)+-&0g&7{|Zwp5>gw;V6WPYgjBU2(FB1gN7g=Lu{8ggwWy=tcJy6LK$Zu%4IrkcKcc3U6@$2l|aInVn(=XpQh?|I(y zrFXX2`01b9-vg+^jhn_b#hZ<4)M(f%kT+(Xv?@bZWTditIvTUXCTg)y9(8-wdhFNG zAZOj4&5dXh&?Y8FBe76Kz+K+Dt=B*^p3v~PoL35z189*yDrIV$iGygDe<;m{fqHb9 zXhf&H;Xdc+3P3ru&7M`KZeHQh05=y<@IIAjfmY}t_2?0!aIqx?H-W08&l z0kbD+PkQaJH5#h%8t8{*A_s#48)T!tK8Fzf2%4}lEPu_a)%)?BiBXKnBDKU^ zK^;UkrdVjeDP&**lNwG4l*qfPN1j#JDpADboO&$pq>1NoNjJD{Sj{Q$UmotQ{VW1e>PYt!S*nnV%EL4l#1l_?%jA9&gfdN#4Gv1U1+w&4NJcvJPbzK#(qqYF<$Fee*Np_Fe6bmI{3 z<)95N^k5CsX3`+O)d(tnfKG(od68sLmN4vq2bI{2ohZg5OBj3^249-N!=^|v9AOO| zBK{YOHTa2i6i;(ZlKetpNlUt@`8)I<$v^fjp54BHp#_XA;P?{01S(v}4{yJP@dTz^ zNMI*hB7tewa?b+fK1*!Dsx4@x>JK>}L$wF{(7<><>TrN(qm@w` zqYn0H(qF&hdsjwV7b19>rT1t2ZG(ze@G7lMtNatK8aEYq4d+t6b9_B1HjZn^a@1C@ z(DjBR{z6)O{)LnS%e2l1(yFSkJEQ7BZVzJT5xbJdyo%4e(N1B3B_F5S5wMGy)PLSl zu!mHO+$zLWiu$dk)be+;DE{_x%QF~WcEEq;rZ9Sl(ThU#u`heLdKg>i%3`0EWPB{a zoI|nY{}fh=;^HC&&2uo`xo-@M7=y$ZB8EkbATjJ!FfQE_L$1Vl_r5X0#E1}MoETwZ zOc3M5Dj1jViE#xR(#NGm-p*a`dC!HL{FJF*gTXuagUrP#c`>(0T$S^=4|_gXnR1#b lXPEMk--VBy*FR<#gM7{$-cCcE3PEu{#J#nPk{8cU@(BbGL;RxHqz6xz~CE4JxEwjm)6HM>RX zzvAC2iUJoDP{A+2Oi?EibsT-?_yKer-{=?ct*>-EO(cQoq?4K5y*JNue&?Qh@7cgD zzxU^Vzxf`(WBB~G_l6SiVmCT9bO@|Vny1aSl$nmVh0~4|w=xDo=#n9Kv-*UAC($EM zxO?>q>_M-Fr{$8eLD`Fa@+ZZw_Mu-xSpKE>Di0tcpv`6yX(yGIS@+`l5d))W7VyR` zXJCHtlr2O4er;lOEfQe)B zA5Vybm;npZvPW&&(uWfU4q#G8l7Kl%MDr3}q>$DyBhV!ORDJTMTBV%AtXxtjtGO;4 zj(}puVglVk`G@+TY}dASoyHjrF9=lSlbCZ7skTVMc9z#ZFR&pPemGLf=+LpGb=(Pg z@e*Fq@UpzB1;wlKN9~9l_SDJ--DzB;qv=G(cA{x>#-i+WA|2Z^A2Ds`ASZO3li%re z;=KG-5A3`kpvJ9q%*ya%ZZ>8*)*3WG8o0O|s2a0UR$=NR1D6r`GFahpEySVl2LxKa z!p0nY0yQn0?w~z~ZUsM}W#9`u)tbfr)+H9XP|asmzF`}DXr_J;>p15xh@b}RIief} za1equ6*z>g>=YQp5Z^)m>%uT9`Ho_tK(8-HC;D)S>}4nL2vv97L#;1T>x)!Rk@^gd zkiAU%1@64dK`!ZAjE&bk`!yDx+nz-_(l2M^xz4cUlY*oMdPDBAhl&10|&J?OxGbh0{x{t28LDNMeD~J;ebX^^@2#M|UzR#S>LjUAQYT2ABGoKIJ-;gTgB8>dOVsiE6HbttB=sbz2~ty} z&Xl2ESe1HF-delacgcm@+_=K^D_jB_YvIU_>Uu@sa=z%w%AzwYnrBf%@Z)^@Rh}f! Ymx60NGuLf=f=@Z|83#9xLfE+Z9}PtThyVZp diff --git a/RaftPackSpring/target/classes/com/revature/service/UserServiceImpl.class b/RaftPackSpring/target/classes/com/revature/service/UserServiceImpl.class index 7a57d25f5304159f448e0d48d5b80c7d63c060c6..8e2c43f047e2cfd5d1b536fa688232d0368215fb 100644 GIT binary patch delta 877 zcmZWnO>YuW6g_XC1qQ@AEgvlkBb1g76ih9q^&_bwrcEGGNlaK0oU{-fEFDeSg^g>M zvvTEMz*dJ4H~s>Dga4t43paY-n^s2Iy!+nFx#ym9a!+Dsu|b$cJh_!;4Bkrbxh}(l z%OM02vVO6q6=nrBfGFZV#299}tv9XGiuP4A+sizO$w2#Snb(pFWXtjHRt3 z&rg;<-S_T!wq-D`ht5j?Zc=4br?er$pXefChEAC(Fb6M*y+St*ClD0OQso45)(>BF zBcdd1T+{MjkQp~C)CR=qoTtVGB1j05s3281iBvJ3S76Qp#bd{0`yZ3SmZt_&$N;o(1PNepKW>0Aq8?NrS81+85{0GZsgmVA@ delta 758 zcmZXR&u$V?6vn?ZgN6CyAEsq!MQ6ZvDxE=416qw$s&-*4NgI+TEJ-DnCYIPVCN@Un z1Gu^?pF(VP8sZDM@FCo~HgWB_7Y!(zGk4DY&N<)t-JjW`Z2t_2S5)!|i3hzW9TPgv z+OTkrpcj|63^ijxfF3e$lRUdzFp-?%qN3V87FT zX5%6}5on83c^gTj#5}c*o7y6gCl2*rotefJ-Ku&3GbvC7zbA&P~98dH4 zCHIwmYDY*rS9v;rzuZUefwKyiWl=z(yl>OWQEe(y*XfsneE;F`kswB@32Hr-J z_-@pENo}a9vGV4aCZRM{v)mXix&6De%5M(< diff --git a/RaftPackSpring/target/m2e-wtp/web-resources/META-INF/maven/com.revature/RaftPackSpring/pom.properties b/RaftPackSpring/target/m2e-wtp/web-resources/META-INF/maven/com.revature/RaftPackSpring/pom.properties index f6b8617..05b88fb 100644 --- a/RaftPackSpring/target/m2e-wtp/web-resources/META-INF/maven/com.revature/RaftPackSpring/pom.properties +++ b/RaftPackSpring/target/m2e-wtp/web-resources/META-INF/maven/com.revature/RaftPackSpring/pom.properties @@ -1,7 +1,7 @@ #Generated by Maven Integration for Eclipse -#Thu Mar 01 01:46:47 EST 2018 +#Fri Mar 02 11:23:55 EST 2018 version=0.0.1-SNAPSHOT groupId=com.revature m2e.projectName=RaftPackSpring -m2e.projectLocation=C\:\\raftpack-dev-3\\raft-pack\\raft-pack\\RaftPackSpring +m2e.projectLocation=C\:\\Users\\m_ngu\\raftpack-dev-6\\raft-pack\\RaftPackSpring artifactId=RaftPackSpring diff --git a/package-lock.json b/package-lock.json index b4a1baa..48e341a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,3 @@ { - "requires": true, - "lockfileVersion": 1, - "dependencies": { - "angular-in-memory-web-api": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/angular-in-memory-web-api/-/angular-in-memory-web-api-0.5.3.tgz", - "integrity": "sha512-1QPwwXG8R/2s7EbHh13HDiJYsk4sdBHNxHJHZHJ/Kxb4T9OG+bb1kGcXzY9UrJkEVxOtUW0ozvL4p/HmeIEszg==" - } - } + "lockfileVersion": 1 } From 2582442694114044659a435190f01a58cdd00560 Mon Sep 17 00:00:00 2001 From: mnnnnn Date: Sat, 3 Mar 2018 18:51:58 -0500 Subject: [PATCH 2/3] notifications added into form-data-upload and dashboard components with react express backend --- RaftPackAngular/package-lock.json | 98 +++++++++---------- RaftPackAngular/package.json | 3 + RaftPackAngular/src/app/app.component.html | 1 + RaftPackAngular/src/app/app.module.ts | 13 ++- .../app/dashboard/dashboard.component.html | 2 +- .../src/app/dashboard/dashboard.component.ts | 17 +++- .../form-data-upload.component.html | 2 +- .../form-data-upload.component.ts | 43 ++++++-- .../src/app/post/post.component.ts | 21 +++- RaftPackAngular/src/main.ts | 2 +- RaftPackAngular/tsconfig.json | 9 +- 11 files changed, 135 insertions(+), 76 deletions(-) diff --git a/RaftPackAngular/package-lock.json b/RaftPackAngular/package-lock.json index 2fbd099..274e40e 100644 --- a/RaftPackAngular/package-lock.json +++ b/RaftPackAngular/package-lock.json @@ -281,6 +281,11 @@ "integrity": "sha512-UBYHWph6P3tutkbXpW6XYg9ZPbTKjw/YC2hGG1/GEvWwTbvezBUv3h+mmUFw79T3RFPnmedpiXdOBbXX+4l0jg==", "dev": true }, + "@types/socket.io-client": { + "version": "1.4.32", + "resolved": "https://registry.npmjs.org/@types/socket.io-client/-/socket.io-client-1.4.32.tgz", + "integrity": "sha512-Vs55Kq8F+OWvy1RLA31rT+cAyemzgm0EWNeax6BWF8H7QiiOYMJIdcwSDdm5LVgfEkoepsWkS+40+WNb7BUMbg==" + }, "@types/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", @@ -368,8 +373,7 @@ "after": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", - "dev": true + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" }, "agent-base": { "version": "2.1.1", @@ -483,6 +487,11 @@ "resolved": "https://registry.npmjs.org/angular2-cookie/-/angular2-cookie-1.2.6.tgz", "integrity": "sha1-j6hFUx53etsEL+LzOcAED23b8J0=" }, + "angular2-notifications": { + "version": "0.9.7", + "resolved": "https://registry.npmjs.org/angular2-notifications/-/angular2-notifications-0.9.7.tgz", + "integrity": "sha1-IQoAfWsVyS0/2bGxo+DiIVF8CeA=" + }, "angular4-datepicker": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/angular4-datepicker/-/angular4-datepicker-1.0.1.tgz", @@ -650,8 +659,7 @@ "arraybuffer.slice": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", - "dev": true + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" }, "arrify": { "version": "1.0.1", @@ -753,8 +761,7 @@ "async-limiter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", - "dev": true + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" }, "asynckit": { "version": "0.4.0", @@ -995,8 +1002,7 @@ "backo2": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", - "dev": true + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" }, "balanced-match": { "version": "1.0.0", @@ -1039,8 +1045,7 @@ "base64-arraybuffer": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", - "dev": true + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=" }, "base64-js": { "version": "1.2.3", @@ -1073,7 +1078,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", - "dev": true, "requires": { "callsite": "1.0.0" } @@ -1144,8 +1148,7 @@ "blob": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", - "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", - "dev": true + "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=" }, "block-stream": { "version": "0.0.9", @@ -1617,8 +1620,7 @@ "callsite": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", - "dev": true + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" }, "camel-case": { "version": "3.0.0", @@ -2098,20 +2100,17 @@ "component-bind": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", - "dev": true + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" }, "component-emitter": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" }, "component-inherit": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", - "dev": true + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" }, "compressible": { "version": "2.0.13", @@ -2755,7 +2754,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "requires": { "ms": "2.0.0" } @@ -3227,7 +3225,6 @@ "version": "3.1.5", "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.1.5.tgz", "integrity": "sha512-Rv9vgb83zrNVhRircUXHi4mtbJhgy2oWtJOCZEbCLFs2HiDSWmh/aOEj8TwoKsn8zXGqTuQuPSoU4v3E10bR6A==", - "dev": true, "requires": { "component-emitter": "1.2.1", "component-inherit": "0.0.3", @@ -3246,7 +3243,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, "requires": { "ms": "2.0.0" } @@ -3257,7 +3253,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.2.tgz", "integrity": "sha512-dInLFzr80RijZ1rGpx1+56/uFoH7/7InhH3kZt+Ms6hT8tNx3NGW/WNSA/f8As1WkOfkuyb3tnRyuXGxusclMw==", - "dev": true, "requires": { "after": "0.8.2", "arraybuffer.slice": "0.0.7", @@ -5253,7 +5248,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.2.tgz", "integrity": "sha1-6D26SfC5vk0CbSc2U1DZ8D9Uvpg=", - "dev": true, "requires": { "isarray": "2.0.1" }, @@ -5261,16 +5255,14 @@ "isarray": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" } } }, "has-cors": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", - "dev": true + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" }, "has-flag": { "version": "2.0.0", @@ -5763,8 +5755,7 @@ "indexof": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" }, "inflection": { "version": "1.10.0", @@ -7588,8 +7579,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "multicast-dns": { "version": "6.2.3", @@ -7681,6 +7671,20 @@ "resolved": "https://registry.npmjs.org/ng-file-upload/-/ng-file-upload-12.2.13.tgz", "integrity": "sha1-AYAPOHLlJvlTEPhHfpnk8S0NjRQ=" }, + "ng-socket-io": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/ng-socket-io/-/ng-socket-io-0.2.4.tgz", + "integrity": "sha1-s5qGnCLzMwHphV3BL/AapmZP5iI=", + "requires": { + "@types/socket.io-client": "1.4.32", + "socket.io-client": "2.0.4" + } + }, + "ng2-notifications": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/ng2-notifications/-/ng2-notifications-0.3.0.tgz", + "integrity": "sha1-L79aEvVKsW/H8ANQdgmLrJ2Bi+4=" + }, "no-case": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", @@ -12019,8 +12023,7 @@ "object-component": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", - "dev": true + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=" }, "object-copy": { "version": "0.1.0", @@ -12431,7 +12434,6 @@ "version": "0.0.5", "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", - "dev": true, "requires": { "better-assert": "1.0.2" } @@ -12440,7 +12442,6 @@ "version": "0.0.5", "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", - "dev": true, "requires": { "better-assert": "1.0.2" } @@ -15339,8 +15340,7 @@ "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" }, "sass-graph": { "version": "2.2.4", @@ -15876,7 +15876,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.0.4.tgz", "integrity": "sha1-CRilUkBtxeVAs4Dc2Xr8SmQzL44=", - "dev": true, "requires": { "backo2": "1.0.2", "base64-arraybuffer": "0.1.5", @@ -15897,7 +15896,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.1.2.tgz", "integrity": "sha1-28IoIVH8T6675Aru3Ady66YZ9/I=", - "dev": true, "requires": { "component-emitter": "1.2.1", "debug": "2.6.9", @@ -15908,8 +15906,7 @@ "isarray": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" } } }, @@ -16564,8 +16561,7 @@ "to-array": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", - "dev": true + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" }, "to-arraybuffer": { "version": "1.0.1", @@ -17074,8 +17070,7 @@ "ultron": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", - "dev": true + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" }, "umd": { "version": "3.0.1", @@ -18478,7 +18473,6 @@ "version": "3.3.3", "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "dev": true, "requires": { "async-limiter": "1.0.0", "safe-buffer": "5.1.1", @@ -18510,8 +18504,7 @@ "xmlhttprequest-ssl": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", - "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", - "dev": true + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=" }, "xregexp": { "version": "2.0.0", @@ -18607,8 +18600,7 @@ "yeast": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", - "dev": true + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" }, "yn": { "version": "2.0.0", diff --git a/RaftPackAngular/package.json b/RaftPackAngular/package.json index c63f3d4..65200d6 100644 --- a/RaftPackAngular/package.json +++ b/RaftPackAngular/package.json @@ -23,12 +23,15 @@ "@angular/router": "^5.2.0", "angular-in-memory-web-api": "^0.5.3", "angular2-cookie": "^1.2.6", + "angular2-notifications": "^0.9.7", "angular4-datepicker": "^1.0.1", "aws-sdk": "^2.202.0", "core-js": "^2.4.1", "cors": "^2.8.4", "install": "^0.10.4", "ng-file-upload": "^12.2.13", + "ng-socket-io": "^0.2.4", + "ng2-notifications": "^0.3.0", "npm": "^5.7.1", "rxjs": "^5.5.6", "zone.js": "^0.8.19" diff --git a/RaftPackAngular/src/app/app.component.html b/RaftPackAngular/src/app/app.component.html index f991192..47bd871 100644 --- a/RaftPackAngular/src/app/app.component.html +++ b/RaftPackAngular/src/app/app.component.html @@ -7,5 +7,6 @@

    +

    diff --git a/RaftPackAngular/src/app/app.module.ts b/RaftPackAngular/src/app/app.module.ts index c7ed175..430a01f 100644 --- a/RaftPackAngular/src/app/app.module.ts +++ b/RaftPackAngular/src/app/app.module.ts @@ -9,7 +9,7 @@ import { LoginService } from './services/login.service'; import { HttpModule } from '@angular/http'; import { NavbarComponent } from './navbar/navbar.component'; import { FormdataUploadComponent } from './form-data-upload/form-data-upload.component'; -import {ReactiveFormsModule} from '@angular/forms'; +import { ReactiveFormsModule } from '@angular/forms'; import { ModifyUserInfoComponent } from './modify-user-info/modify-user-info.component'; import { AppRoutingModule } from './app-routing.module'; @@ -31,6 +31,12 @@ import { FeedComponent } from './feed/feed.component'; import { FriendProfileComponent } from './friend-profile/friend-profile.component'; import { SearchComponent } from './search/search.component'; import { SearchService } from './services/search.service'; +import { SocketIoModule, SocketIoConfig } from 'ng-socket-io'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { SimpleNotificationsModule } from 'angular2-notifications'; +const config: SocketIoConfig = { + url: 'http://localhost:8000', options: {}}; + @NgModule({ declarations: [ @@ -55,7 +61,10 @@ import { SearchService } from './services/search.service'; AppRoutingModule, HttpModule, HttpClientModule, - ReactiveFormsModule + ReactiveFormsModule, + SocketIoModule.forRoot(config), + BrowserAnimationsModule, + SimpleNotificationsModule.forRoot() ], providers: [ProfileService, MessageService, LoginService, RegisterService, UploadFileService, ModifyUserService, PostService, SearchService, PostComponent], diff --git a/RaftPackAngular/src/app/dashboard/dashboard.component.html b/RaftPackAngular/src/app/dashboard/dashboard.component.html index dff9f9f..2fddfb9 100644 --- a/RaftPackAngular/src/app/dashboard/dashboard.component.html +++ b/RaftPackAngular/src/app/dashboard/dashboard.component.html @@ -1,6 +1,6 @@
    - +
    diff --git a/RaftPackAngular/src/app/dashboard/dashboard.component.ts b/RaftPackAngular/src/app/dashboard/dashboard.component.ts index d18e3f6..3bde1ff 100644 --- a/RaftPackAngular/src/app/dashboard/dashboard.component.ts +++ b/RaftPackAngular/src/app/dashboard/dashboard.component.ts @@ -1,5 +1,11 @@ import { Component, OnInit } from '@angular/core'; +import { Socket } from 'ng-socket-io'; +import { Observable } from 'rxjs/Observable'; +import 'rxjs/add/observable/of'; +import 'rxjs/add/operator/timeout'; +import { defer as _defer } from 'lodash'; +import { NotificationsService } from 'angular2-notifications'; @Component({ selector: 'app-dashboard', templateUrl: './dashboard.component.html', @@ -7,7 +13,16 @@ import { Component, OnInit } from '@angular/core'; }) export class DashboardComponent implements OnInit { - constructor() { } + constructor(private socket: Socket, private notificationsService: NotificationsService) { + socket.on('new notification', function (data) { + notificationsService.info('', data, { + timeOut: 3000, + pauseOnHover: true, + clickToClose: true + }); + // alert(data); + }); + } ngOnInit() { } diff --git a/RaftPackAngular/src/app/form-data-upload/form-data-upload.component.html b/RaftPackAngular/src/app/form-data-upload/form-data-upload.component.html index cc1955d..5ea89c8 100644 --- a/RaftPackAngular/src/app/form-data-upload/form-data-upload.component.html +++ b/RaftPackAngular/src/app/form-data-upload/form-data-upload.component.html @@ -5,7 +5,7 @@ - + \ No newline at end of file diff --git a/RaftPackAngular/src/app/form-data-upload/form-data-upload.component.ts b/RaftPackAngular/src/app/form-data-upload/form-data-upload.component.ts index b34ff6f..07add7d 100644 --- a/RaftPackAngular/src/app/form-data-upload/form-data-upload.component.ts +++ b/RaftPackAngular/src/app/form-data-upload/form-data-upload.component.ts @@ -6,6 +6,7 @@ import { Post } from '../models/post.model'; import { ProfileService } from './../services/profile.service'; import { User } from '../models/user.model'; import { PostComponent } from './../post/post.component'; +import { Socket } from 'ng-socket-io'; @Component({ selector: 'app-form-data-upload', @@ -21,7 +22,7 @@ export class FormdataUploadComponent { @ViewChild('fileInput') fileInput: ElementRef; constructor(private fb: FormBuilder, private uploadFileService: UploadFileService, private postService: PostService, - private profileService: ProfileService, private postComponent: PostComponent) { + private profileService: ProfileService, private postComponent: PostComponent, private socket: Socket) { this.createForm(); } @@ -42,28 +43,52 @@ export class FormdataUploadComponent { private prepareSave(): any { const input = new FormData(); input.append('message', this.form.get('message').value); - input.append('image', this.form.get('image').value); + if (this.form.get('image') != null) { + input.append('image', this.form.get('image').value); + } else { input.append('image', null); } + return input; } onSubmit() { const formModel = this.prepareSave(); this.loading = true; - this.uploadFileService.uploadfile(this.file).subscribe(image => {this.post.image = image; + if (this.form.get('image').value != null) { + this.uploadFileService.uploadfile(this.file).subscribe(image => { + this.post.image = image; + this.profileService.getProfile(parseInt(document.cookie, 10)).subscribe(user => { + this.post.user = user; + console.log(this.post); + this.post.message = this.form.get('message').value; + console.log(this.post); + this.postComponent.createPost(this.post.message, this.post.image); + console.log(this.post); + setTimeout(() => { + alert('done!'); + this.loading = false; + }, 1000); + this.sendNotification(user, this.post.message); + }); + }); + } else { this.profileService.getProfile(parseInt(document.cookie, 10)).subscribe(user => { this.post.user = user; console.log(this.post); this.post.message = this.form.get('message').value; console.log(this.post); - this.postComponent.createPost(this.post.message, this.post.image); + this.postComponent.createPost(this.post.message, null); console.log(this.post); + setTimeout(() => { + alert('done!'); + this.loading = false; + }, 1000); + this.sendNotification(user, this.post.message); }); - }); + } - setTimeout(() => { - alert('done!'); - this.loading = false; - }, 1000); + } + sendNotification(user: User, message: string) { + this.socket.emit('create notification', user.first_name + user.last_name + ': ' + message ); } clearFile() { diff --git a/RaftPackAngular/src/app/post/post.component.ts b/RaftPackAngular/src/app/post/post.component.ts index 0f984ea..001be47 100644 --- a/RaftPackAngular/src/app/post/post.component.ts +++ b/RaftPackAngular/src/app/post/post.component.ts @@ -8,6 +8,7 @@ import { PostService } from '../services/post.service'; import { Message } from '../models/message.model'; import { UploadFileService } from '../services/upload.service'; import { FormdataUploadComponent } from './../form-data-upload/form-data-upload.component'; +import { Socket } from 'ng-socket-io'; @Component({ selector: 'app-post', templateUrl: './post.component.html', @@ -22,9 +23,13 @@ export class PostComponent implements OnInit { postImage: string; message: Message; user = new User(0, '', '', '', '', '', '', '', ''); - constructor(private route: ActivatedRoute, private router: Router, - private userService: ProfileService, private postService: PostService, private uploadService: UploadFileService) { - } + constructor( + private route: ActivatedRoute, + private router: Router, + private userService: ProfileService, + private postService: PostService, + private uploadService: UploadFileService, + ) { } ngOnInit() { this.getAllPosts(parseInt(document.cookie, 10)); @@ -32,11 +37,17 @@ export class PostComponent implements OnInit { } createPost(postText: string, postImage: string) { - this.url = 'https://s3.amazonaws.com/jsa-angular-bucket/jsa-s3/' + postImage + '.png'; - this.post = { postId: 0, message: postText, image: this.url, numOfLikes: 0, user: this.user, date: null }; + if (postImage != null) { + this.url = 'https://s3.amazonaws.com/jsa-angular-bucket/jsa-s3/' + postImage + '.png'; + this.post = { postId: 0, message: postText, image: this.url, numOfLikes: 0, user: this.user, date: null }; + this.postService.createPost(this.post).subscribe(message => { + this.message = message; console.log(message); + }); + } else { this.post = { postId: 0, message: postText, image: null, numOfLikes: 0, user: this.user, date: null }; this.postService.createPost(this.post).subscribe(message => { this.message = message; console.log(message); }); + } } getAllPosts(userId: number): void { diff --git a/RaftPackAngular/src/main.ts b/RaftPackAngular/src/main.ts index 91ec6da..d4028b1 100644 --- a/RaftPackAngular/src/main.ts +++ b/RaftPackAngular/src/main.ts @@ -1,6 +1,6 @@ import { enableProdMode } from '@angular/core'; import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; - +import 'angular2-notifications'; import { AppModule } from './app/app.module'; import { environment } from './environments/environment'; diff --git a/RaftPackAngular/tsconfig.json b/RaftPackAngular/tsconfig.json index fc7e3a8..f667170 100644 --- a/RaftPackAngular/tsconfig.json +++ b/RaftPackAngular/tsconfig.json @@ -11,10 +11,13 @@ "typeRoots": [ "node_modules/@types" ], - "types": ["node"], "lib": [ "es2017", "dom" ] - } -} + }, + "include": [ + "src/**/*", + "node_modules/ng-socket-io/index.ts" + ] +} \ No newline at end of file From 0cdc39dbb9f5ed220dc854ffad38834611a7d405 Mon Sep 17 00:00:00 2001 From: mnnnnn Date: Mon, 5 Mar 2018 03:22:05 -0500 Subject: [PATCH 3/3] ... --- RaftPackAngular/src/app/app-routing.module.ts | 9 +- RaftPackAngular/src/app/app.component.css | 13 +- RaftPackAngular/src/app/app.component.html | 12 +- RaftPackAngular/src/app/app.component.ts | 1 - RaftPackAngular/src/app/app.module.ts | 4 +- .../src/app/dashboard/dashboard.component.css | 32 ++ .../app/dashboard/dashboard.component.html | 24 +- .../src/app/feed/feed.component.html | 22 +- .../src/app/feed/feed.component.ts | 1 + .../form-data-upload.component.css | 3 + .../form-data-upload.component.html | 21 +- .../form-data-upload.component.ts | 5 +- .../src/app/login/login.component.css | 64 +++- .../src/app/login/login.component.html | 16 +- .../src/app/login/login.component.ts | 3 +- .../modify-user-info.component.html | 58 ++-- .../modify-user-info.component.ts | 1 + .../src/app/navbar/navbar.component.css | 3 +- .../src/app/navbar/navbar.component.html | 14 +- .../src/app/navbar/navbar.component.ts | 11 +- .../post-details/post-details.component.html | 6 +- .../post-details/post-details.component.ts | 16 +- .../src/app/post/post.component.html | 7 +- .../src/app/post/post.component.ts | 3 +- .../profile-posts/profile-posts.component.css | 0 .../profile-posts.component.html | 23 ++ .../profile-posts.component.spec.ts | 25 ++ .../profile-posts/profile-posts.component.ts | 29 ++ .../src/app/profile/profile.component.css | 4 + .../src/app/profile/profile.component.html | 13 +- .../src/app/profile/profile.component.ts | 9 +- .../src/app/services/post.service.ts | 6 + .../src/assets/images/Untitled.png | Bin 0 -> 1404 bytes RaftPackAngular/src/assets/images/bg.jpg | Bin 0 -> 126073 bytes RaftPackAngular/src/index.html | 10 +- RaftPackAngular/src/styles.css | 1 - RaftPackSpring/.classpath | 6 +- RaftPackSpring/doc/com/revature/Main.html | 271 +++++++++++++++++ .../revature/repository/PostRepository.html | 277 ++++++++++++++++++ RaftPackSpring/pom.xml | 58 ++-- .../resources => }/applicationContext.xml | 4 +- .../src/main/java/com/revature/Main.java | 20 +- .../revature/controller/UserController.java | 107 ++++++- .../main/java/com/revature/model/Post.java | 165 ++++++++++- .../main/java/com/revature/model/User.java | 221 +++++++++++++- .../repository/PostRepositoryImpl.java | 5 +- .../repository/UserRepositoryImpl.java | 7 +- .../com/revature/service/PostService.java | 9 +- .../com/revature/service/PostServiceImpl.java | 107 ++++++- .../com/revature/service/UserService.java | 1 + .../com/revature/service/UserServiceImpl.java | 97 +++++- .../src/main/resources/applicationContext.xml | 4 +- .../src/main/resources/log4j.properties | 25 +- .../webapp/WEB-INF/applicationContext.xml | 3 +- .../com/revature/test/ControllerTests.java | 88 +++++- .../src/test/resources/log4j.properties | 9 - .../target/classes/com/revature/Main.class | Bin 1254 -> 1399 bytes .../revature/controller/UserController.class | Bin 5440 -> 6895 bytes .../classes/com/revature/model/Post.class | Bin 4463 -> 5588 bytes .../classes/com/revature/model/User.class | Bin 9082 -> 9175 bytes .../repository/PostRepositoryImpl.class | Bin 1798 -> 2104 bytes .../repository/UserRepositoryImpl.class | Bin 4224 -> 4278 bytes .../com/revature/service/UserService.class | Bin 592 -> 736 bytes .../revature/service/UserServiceImpl.class | Bin 3059 -> 3841 bytes .../RaftPackSpring/pom.properties | 4 +- .../maven/com.revature/RaftPackSpring/pom.xml | 58 ++-- 66 files changed, 1752 insertions(+), 263 deletions(-) create mode 100644 RaftPackAngular/src/app/profile-posts/profile-posts.component.css create mode 100644 RaftPackAngular/src/app/profile-posts/profile-posts.component.html create mode 100644 RaftPackAngular/src/app/profile-posts/profile-posts.component.spec.ts create mode 100644 RaftPackAngular/src/app/profile-posts/profile-posts.component.ts create mode 100644 RaftPackAngular/src/assets/images/Untitled.png create mode 100644 RaftPackAngular/src/assets/images/bg.jpg create mode 100644 RaftPackSpring/doc/com/revature/Main.html create mode 100644 RaftPackSpring/doc/com/revature/repository/PostRepository.html rename RaftPackSpring/src/{test/resources => }/applicationContext.xml (96%) delete mode 100644 RaftPackSpring/src/test/resources/log4j.properties diff --git a/RaftPackAngular/src/app/app-routing.module.ts b/RaftPackAngular/src/app/app-routing.module.ts index bb3c8ab..cc6a87b 100644 --- a/RaftPackAngular/src/app/app-routing.module.ts +++ b/RaftPackAngular/src/app/app-routing.module.ts @@ -7,7 +7,9 @@ import { ModifyUserInfoComponent } from './modify-user-info/modify-user-info.com import { ProfileComponent } from './profile/profile.component'; import { PostComponent } from './post/post.component'; import { DashboardComponent } from './dashboard/dashboard.component'; +import { PostDetailsComponent } from './post-details/post-details.component'; import { FriendProfileComponent } from './friend-profile/friend-profile.component'; +import { ProfilePostsComponent } from './profile-posts/profile-posts.component'; @@ -17,13 +19,14 @@ export const routes: Routes = [ { path: 'login', component: LoginComponent }, { path: 'login/register', component : RegisterComponent}, { path: 'modify-user-info', component : ModifyUserInfoComponent}, + {path: 'profilePosts', component: ProfilePostsComponent}, { path: 'profile', component : ProfileComponent}, { path: 'profile/:id', component : ProfileComponent}, - { path: 'post', component : PostComponent}, + { path: 'createPost', component : PostComponent}, + { path: 'post', component: PostDetailsComponent }, { path: 'dashboard', component : DashboardComponent}, - { path: 'friend-profile', component : FriendProfileComponent}, { path: 'register', component : RegisterComponent}, - + { path: 'friend-profile', component : FriendProfileComponent} ]; @NgModule({ diff --git a/RaftPackAngular/src/app/app.component.css b/RaftPackAngular/src/app/app.component.css index 128599a..1b49fdf 100644 --- a/RaftPackAngular/src/app/app.component.css +++ b/RaftPackAngular/src/app/app.component.css @@ -1,12 +1,3 @@ - -.badge.badge-default{ - background-color : saddlebrown; - padding-left: 30px; - padding-right: 30px; - -} - -.headerColor{ - background-color : rgb(24, 24, 136); - height : 55px; +jumbotron{ + background: rgba(248, 248, 248, 0.438); } \ No newline at end of file diff --git a/RaftPackAngular/src/app/app.component.html b/RaftPackAngular/src/app/app.component.html index 47bd871..58fe816 100644 --- a/RaftPackAngular/src/app/app.component.html +++ b/RaftPackAngular/src/app/app.component.html @@ -1,12 +1,6 @@ -
    -
    -

    - RaftPack -

    -
    + +
    - -
    -
    +
    \ No newline at end of file diff --git a/RaftPackAngular/src/app/app.component.ts b/RaftPackAngular/src/app/app.component.ts index 8a76c1b..c1d0038 100644 --- a/RaftPackAngular/src/app/app.component.ts +++ b/RaftPackAngular/src/app/app.component.ts @@ -7,5 +7,4 @@ import { Component } from '@angular/core'; }) export class AppComponent { title = 'RaftPack'; - isLoggedIn = false; } diff --git a/RaftPackAngular/src/app/app.module.ts b/RaftPackAngular/src/app/app.module.ts index 430a01f..c706c1d 100644 --- a/RaftPackAngular/src/app/app.module.ts +++ b/RaftPackAngular/src/app/app.module.ts @@ -34,6 +34,7 @@ import { SearchService } from './services/search.service'; import { SocketIoModule, SocketIoConfig } from 'ng-socket-io'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { SimpleNotificationsModule } from 'angular2-notifications'; +import { ProfilePostsComponent } from './profile-posts/profile-posts.component'; const config: SocketIoConfig = { url: 'http://localhost:8000', options: {}}; @@ -53,7 +54,8 @@ const config: SocketIoConfig = { FeedComponent, FriendProfileComponent, SearchComponent, - FormdataUploadComponent + FormdataUploadComponent, + ProfilePostsComponent ], imports: [ BrowserModule, diff --git a/RaftPackAngular/src/app/dashboard/dashboard.component.css b/RaftPackAngular/src/app/dashboard/dashboard.component.css index e69de29..a51d975 100644 --- a/RaftPackAngular/src/app/dashboard/dashboard.component.css +++ b/RaftPackAngular/src/app/dashboard/dashboard.component.css @@ -0,0 +1,32 @@ +.content:before { + content: ""; + position: fixed; + left: 0; + right: 0; + z-index: -1; + + display: block; + background-image: url('https://www.imgbase.info/images/safe-wallpapers/video_games/minecraft/48219_minecraft.jpg'); + background-color: gainsboro; + background-repeat: no-repeat; + background-size: cover; + width: 100%; + height:100%; + + -webkit-filter: blur(5px); + -moz-filter: blur(5px); + -o-filter: blur(5px); + -ms-filter: blur(5px); + filter: blur(5px); + } + + .content { + position: fixed; + left: 0; + right: 0; + z-index: 0; + margin-left: 20px; + margin-right: 20px; + } + + \ No newline at end of file diff --git a/RaftPackAngular/src/app/dashboard/dashboard.component.html b/RaftPackAngular/src/app/dashboard/dashboard.component.html index 2fddfb9..0487c5b 100644 --- a/RaftPackAngular/src/app/dashboard/dashboard.component.html +++ b/RaftPackAngular/src/app/dashboard/dashboard.component.html @@ -1,12 +1,16 @@ - -
    +
    + +
    + +
    -
    -
    - -

    -
    Feed:

    - -

    -Bottom Dashboard +
    + +
    + +
    + + + +
    \ No newline at end of file diff --git a/RaftPackAngular/src/app/feed/feed.component.html b/RaftPackAngular/src/app/feed/feed.component.html index 4b1feeb..daca4c9 100644 --- a/RaftPackAngular/src/app/feed/feed.component.html +++ b/RaftPackAngular/src/app/feed/feed.component.html @@ -1,7 +1,15 @@ -
    -
  • {{post.message}} {{post.user.first_name}} - {{post.user.last_name}} {{post.date}} -
  • - -
    -
    +
    +
      +
      +
      +

      {{post.date}} {{post.user.first_name}} {{post.user.last_name}}

      +
      +
      + {{post.message}} +
      {{post.numOfLikes}} +
      + +
      +
    +
    + diff --git a/RaftPackAngular/src/app/feed/feed.component.ts b/RaftPackAngular/src/app/feed/feed.component.ts index 6005250..5677dd3 100644 --- a/RaftPackAngular/src/app/feed/feed.component.ts +++ b/RaftPackAngular/src/app/feed/feed.component.ts @@ -10,6 +10,7 @@ import { Post } from '../models/post.model'; }) export class FeedComponent implements OnInit { public posts: Post[] = []; + public uId = parseInt(document.cookie, 10); constructor(private postService: PostService) { } viewFeed(): void { this.postService.getAllPosts().subscribe(posts => this.posts = posts); diff --git a/RaftPackAngular/src/app/form-data-upload/form-data-upload.component.css b/RaftPackAngular/src/app/form-data-upload/form-data-upload.component.css index e69de29..f2f3064 100644 --- a/RaftPackAngular/src/app/form-data-upload/form-data-upload.component.css +++ b/RaftPackAngular/src/app/form-data-upload/form-data-upload.component.css @@ -0,0 +1,3 @@ +div{ + color: white; +} \ No newline at end of file diff --git a/RaftPackAngular/src/app/form-data-upload/form-data-upload.component.html b/RaftPackAngular/src/app/form-data-upload/form-data-upload.component.html index 5ea89c8..881912b 100644 --- a/RaftPackAngular/src/app/form-data-upload/form-data-upload.component.html +++ b/RaftPackAngular/src/app/form-data-upload/form-data-upload.component.html @@ -1,11 +1,14 @@ -
    - - - +
    + + + + - + - - - \ No newline at end of file + + + + +
    + diff --git a/RaftPackAngular/src/app/form-data-upload/form-data-upload.component.ts b/RaftPackAngular/src/app/form-data-upload/form-data-upload.component.ts index 07add7d..45ec712 100644 --- a/RaftPackAngular/src/app/form-data-upload/form-data-upload.component.ts +++ b/RaftPackAngular/src/app/form-data-upload/form-data-upload.component.ts @@ -7,6 +7,7 @@ import { ProfileService } from './../services/profile.service'; import { User } from '../models/user.model'; import { PostComponent } from './../post/post.component'; import { Socket } from 'ng-socket-io'; +import { Router } from '@angular/router'; @Component({ selector: 'app-form-data-upload', @@ -22,7 +23,7 @@ export class FormdataUploadComponent { @ViewChild('fileInput') fileInput: ElementRef; constructor(private fb: FormBuilder, private uploadFileService: UploadFileService, private postService: PostService, - private profileService: ProfileService, private postComponent: PostComponent, private socket: Socket) { + private profileService: ProfileService, private postComponent: PostComponent, private socket: Socket, private router: Router) { this.createForm(); } @@ -68,6 +69,7 @@ export class FormdataUploadComponent { this.loading = false; }, 1000); this.sendNotification(user, this.post.message); + this.router.navigate(['/dashboard']); }); }); } else { @@ -83,6 +85,7 @@ export class FormdataUploadComponent { this.loading = false; }, 1000); this.sendNotification(user, this.post.message); + this.router.navigate(['/dashboard']); }); } diff --git a/RaftPackAngular/src/app/login/login.component.css b/RaftPackAngular/src/app/login/login.component.css index 4dee6b2..becd9a3 100644 --- a/RaftPackAngular/src/app/login/login.component.css +++ b/RaftPackAngular/src/app/login/login.component.css @@ -1,21 +1,33 @@ -body { - padding-top: 40px; - padding-bottom: 40px; - background-color: #eee; - } - - + #filterLabel { text-align: center; } - + .jumbotron { + position: relative; + top: 25px; + background: rgba(218, 228, 223, 0.3) + } .form-signin { max-width: 330px; padding: 15px; margin: 0 auto; } - + a:link, a:visited { + color: white; + border-style: solid; + border-color: black; + width: auto; + padding: 14px 25px; + text-align: center; + text-decoration: none; + display: inline-block; +} + +a:hover, a:active { + background-color:black; +} + .form-signin-heading { text-align: center; } @@ -48,4 +60,36 @@ body { margin-bottom: 10px; border-top-left-radius: 0; border-top-right-radius: 0; - } \ No newline at end of file + } + +.content:before { + content: ""; + position: fixed; + left: 0; + right: 0; + z-index: -1; + + display: block; + background-image: url('https://pre00.deviantart.net/1db7/th/pre/f/2014/124/f/e/minecraft_day_background__hd_3200x1800__by_567legodude-d7h5yia.png'); + background-repeat: no-repeat; + background-size: cover; + width: 100%; + height:100%; + + -webkit-filter: blur(5px); + -moz-filter: blur(5px); + -o-filter: blur(5px); + -ms-filter: blur(5px); + filter: blur(5px); +} + +.content { + position: fixed; + left: 0; + right: 0; + z-index: 0; + margin-left: 20px; + margin-right: 20px; +} + + \ No newline at end of file diff --git a/RaftPackAngular/src/app/login/login.component.html b/RaftPackAngular/src/app/login/login.component.html index 152f0f5..9b2847f 100644 --- a/RaftPackAngular/src/app/login/login.component.html +++ b/RaftPackAngular/src/app/login/login.component.html @@ -1,4 +1,7 @@ -
    + +
    + \ No newline at end of file diff --git a/RaftPackAngular/src/app/login/login.component.ts b/RaftPackAngular/src/app/login/login.component.ts index 1dc398d..69ed81a 100644 --- a/RaftPackAngular/src/app/login/login.component.ts +++ b/RaftPackAngular/src/app/login/login.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, Input } from '@angular/core'; import { NgModule } from '@angular/core'; import { LoginService } from '../services/login.service'; @@ -6,6 +6,7 @@ import { LoginService } from '../services/login.service'; import { User } from '../models/user.model'; import { Message } from '../models/message.model'; import { Router } from '@angular/router'; + @Component({ selector: 'app-login', templateUrl: './login.component.html', diff --git a/RaftPackAngular/src/app/modify-user-info/modify-user-info.component.html b/RaftPackAngular/src/app/modify-user-info/modify-user-info.component.html index 3fa205b..1988da3 100644 --- a/RaftPackAngular/src/app/modify-user-info/modify-user-info.component.html +++ b/RaftPackAngular/src/app/modify-user-info/modify-user-info.component.html @@ -1,38 +1,40 @@ - + +
    +

    + + Edit Profile

    -
    -

    Edit Profile

    +
    -
    +
    Upload a different photo...
    -
    Upload a different photo...
    +
    +
    + -
    -
    - + - + - - -
    - -
    - - -
    - -
    - - - -

    Enter your Date of Birth

    - - +
    +
    -
    - + + +
    +
    -
    + + + +

    Enter your Date of Birth

    + + +
    +
    + +
    +
    diff --git a/RaftPackAngular/src/app/modify-user-info/modify-user-info.component.ts b/RaftPackAngular/src/app/modify-user-info/modify-user-info.component.ts index 40ffa59..3639b48 100644 --- a/RaftPackAngular/src/app/modify-user-info/modify-user-info.component.ts +++ b/RaftPackAngular/src/app/modify-user-info/modify-user-info.component.ts @@ -13,6 +13,7 @@ import {ProfileComponent} from '../profile/profile.component'; }) export class ModifyUserInfoComponent implements OnInit { + @Input() exists: boolean; user: User; edit = false; message: Message; diff --git a/RaftPackAngular/src/app/navbar/navbar.component.css b/RaftPackAngular/src/app/navbar/navbar.component.css index df8b784..25c318e 100644 --- a/RaftPackAngular/src/app/navbar/navbar.component.css +++ b/RaftPackAngular/src/app/navbar/navbar.component.css @@ -12,7 +12,7 @@ background-color: white; cursor: pointer; list-style-type: none; - position: absolute; + position: relative; } .search-result li:hover { @@ -39,4 +39,5 @@ ul.search-result { margin-top: 0; padding-left: 0; + position: absolute; } \ No newline at end of file diff --git a/RaftPackAngular/src/app/navbar/navbar.component.html b/RaftPackAngular/src/app/navbar/navbar.component.html index 9112f09..34f3ca7 100644 --- a/RaftPackAngular/src/app/navbar/navbar.component.html +++ b/RaftPackAngular/src/app/navbar/navbar.component.html @@ -1,4 +1,4 @@ -