diff --git a/package-lock.json b/package-lock.json index 8576f71..01ae196 100644 --- a/package-lock.json +++ b/package-lock.json @@ -385,11 +385,19 @@ "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", "dev": true }, + "@types/mongoose": { + "version": "5.11.97", + "resolved": "https://registry.npmjs.org/@types/mongoose/-/mongoose-5.11.97.tgz", + "integrity": "sha512-cqwOVYT3qXyLiGw7ueU2kX9noE8DPGRY6z8eUxudhXY8NZ7DMKYAxyZkLSevGfhCX3dO/AoX5/SO9lAzfjon0Q==", + "dev": true, + "requires": { + "mongoose": "*" + } + }, "@types/node": { "version": "15.14.9", "resolved": "https://registry.npmjs.org/@types/node/-/node-15.14.9.tgz", - "integrity": "sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==", - "dev": true + "integrity": "sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==" }, "@types/normalize-package-data": { "version": "2.4.1", @@ -428,6 +436,20 @@ "socket.io-client": "*" } }, + "@types/webidl-conversions": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-6.1.1.tgz", + "integrity": "sha512-XAahCdThVuCFDQLT7R7Pk/vqeObFNL3YqRyFZg+AqAP/W1/w3xHaIxuW7WszQqTbIBOPRcItYJIou3i/mppu3Q==" + }, + "@types/whatwg-url": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.1.tgz", + "integrity": "sha512-2YubE1sjj5ifxievI5Ge1sckb9k/Er66HyR2c+3+I6VDUUg1TLPdYYTEbQ+DjRkS4nTxMJhgWfSfMRD2sl2EYQ==", + "requires": { + "@types/node": "*", + "@types/webidl-conversions": "*" + } + }, "@typescript-eslint/eslint-plugin": { "version": "4.31.2", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.31.2.tgz", @@ -696,6 +718,11 @@ "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=" }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, "base64id": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", @@ -816,6 +843,23 @@ "fill-range": "^7.0.1" } }, + "bson": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.5.2.tgz", + "integrity": "sha512-8CEMJpwc7qlQtrn2rney38jQSEeMar847lz0LyitwRmVknAW8iHXrzW4fTjHfyWm0E3sukyD/zppdH+QU1QefA==", + "requires": { + "buffer": "^5.6.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", @@ -1116,6 +1160,11 @@ "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", "dev": true }, + "denque": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", + "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==" + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -1591,6 +1640,11 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, "ignore": { "version": "5.1.8", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", @@ -1755,6 +1809,11 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, + "kareem": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.2.tgz", + "integrity": "sha512-STHz9P7X2L4Kwn72fA4rGyqyXdmrMSdxqHx9IXon/FXluXieaFA6KJ2upcHAHxQPQ0LeM/OjLrhFxifHewOALQ==" + }, "keyv": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", @@ -1828,6 +1887,12 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, + "memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -1893,6 +1958,79 @@ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, + "mongodb": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.1.1.tgz", + "integrity": "sha512-fbACrWEyvr6yl0sSiCGV0sqEiBwTtDJ8iSojmkDjAfw9JnOZSAkUyv9seFSPYhPPKwxp1PDtyjvBNfMDz0WBLQ==", + "requires": { + "bson": "^4.5.1", + "denque": "^1.5.0", + "mongodb-connection-string-url": "^2.0.0", + "saslprep": "^1.0.0" + } + }, + "mongodb-connection-string-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.1.0.tgz", + "integrity": "sha512-Qf9Zw7KGiRljWvMrrUFDdVqo46KIEiDuCzvEN97rh/PcKzk2bd6n9KuzEwBwW9xo5glwx69y1mI6s+jFUD/aIQ==", + "requires": { + "@types/whatwg-url": "^8.2.1", + "whatwg-url": "^9.1.0" + } + }, + "mongoose": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.0.7.tgz", + "integrity": "sha512-44STDcV6awu0zfo1Z3NyKPHZwfVrGU93/QgR0gYbt4bik/nEa7lI1RRGcq5oyGM0YE7l63i2j80v1OhvrlFvYw==", + "requires": { + "bson": "^4.2.2", + "kareem": "2.3.2", + "mongodb": "4.1.1", + "mpath": "0.8.4", + "mquery": "4.0.0", + "ms": "2.1.2", + "regexp-clone": "1.0.0", + "sift": "13.5.2", + "sliced": "1.0.1" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "mpath": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.4.tgz", + "integrity": "sha512-DTxNZomBcTWlrMW76jy1wvV37X/cNNxPW1y2Jzd4DZkAaC5ZGsm8bfGfNOthcDuRJujXLqiuS6o3Tpy0JEoh7g==" + }, + "mquery": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.0.tgz", + "integrity": "sha512-nGjm89lHja+T/b8cybAby6H0YgA4qYC/lx6UlwvHGqvTq8bDaNeCwl1sY8uRELrNbVWJzIihxVd+vphGGn1vBw==", + "requires": { + "debug": "4.x", + "regexp-clone": "^1.0.0", + "sliced": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -2116,6 +2254,11 @@ "once": "^1.3.1" } }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, "pupa": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", @@ -2185,6 +2328,11 @@ "picomatch": "^2.2.1" } }, + "regexp-clone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", + "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" + }, "regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", @@ -2268,6 +2416,15 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "requires": { + "sparse-bitfield": "^3.0.3" + } + }, "semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -2337,6 +2494,11 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" }, + "sift": { + "version": "13.5.2", + "resolved": "https://registry.npmjs.org/sift/-/sift-13.5.2.tgz", + "integrity": "sha512-+gxdEOMA2J+AI+fVsCqeNn7Tgx3M9ZN9jdi95939l1IJ8cZsqS8sqpJyOkic2SJk+1+98Uwryt/gL6XDaV+UZA==" + }, "signal-exit": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.4.tgz", @@ -2349,6 +2511,11 @@ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, + "sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" + }, "socket.io": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.2.0.tgz", @@ -2453,6 +2620,15 @@ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true }, + "sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", + "optional": true, + "requires": { + "memory-pager": "^1.0.2" + } + }, "spawn-command": { "version": "0.0.2-1", "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", @@ -2572,6 +2748,14 @@ "nopt": "~1.0.10" } }, + "tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "requires": { + "punycode": "^2.1.1" + } + }, "tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -2767,6 +2951,20 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==" + }, + "whatwg-url": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-9.1.0.tgz", + "integrity": "sha512-CQ0UcrPHyomtlOCot1TL77WyMIm/bCwrJ2D6AOKGwEczU9EpyoqAokfqrf/MioU9kHcMsmJZcg1egXix2KYEsA==", + "requires": { + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + } + }, "widest-line": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", diff --git a/package.json b/package.json index 28d1c53..3780ea1 100644 --- a/package.json +++ b/package.json @@ -26,11 +26,13 @@ }, "dependencies": { "express": "^4.17.1", + "mongoose": "^6.0.7", "socket.io": "^4.1.2" }, "devDependencies": { "@babel/preset-typescript": "^7.14.5", "@types/express": "^4.17.12", + "@types/mongoose": "^5.11.97", "@types/node": "^15.12.2", "@types/socket.io-client": "^3.0.0", "@typescript-eslint/eslint-plugin": "^4.26.1", diff --git a/src/client/src/app/app-routing.module.ts b/src/client/src/app/app-routing.module.ts index 0297262..36492ea 100644 --- a/src/client/src/app/app-routing.module.ts +++ b/src/client/src/app/app-routing.module.ts @@ -1,7 +1,12 @@ +import { AddPostComponent } from './components/add-post/add-post.component'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; +import { AddUserComponent } from './components/add-user/add-user.component'; -const routes: Routes = []; +const routes: Routes = [ + {path: "create-post", component:AddPostComponent }, + {path: "create-user", component:AddUserComponent }, +]; @NgModule({ imports: [RouterModule.forRoot(routes)], diff --git a/src/client/src/app/app.component.html b/src/client/src/app/app.component.html index 25c25d5..04cd27d 100644 --- a/src/client/src/app/app.component.html +++ b/src/client/src/app/app.component.html @@ -1 +1,2 @@ -{{title}} \ No newline at end of file + + diff --git a/src/client/src/app/app.module.ts b/src/client/src/app/app.module.ts index 38150af..c68e290 100644 --- a/src/client/src/app/app.module.ts +++ b/src/client/src/app/app.module.ts @@ -3,15 +3,23 @@ import { BrowserModule } from '@angular/platform-browser'; import { HttpClientModule } from '@angular/common/http'; import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; +import { AddUserComponent } from './components/add-user/add-user.component'; +import { FormsModule } from '@angular/forms'; +import { AddPostComponent } from './components/add-post/add-post.component'; +import { NavigationComponent } from './components/navigation/navigation.component'; @NgModule({ declarations: [ - AppComponent + AppComponent, + AddUserComponent, + AddPostComponent, + NavigationComponent ], imports: [ BrowserModule, AppRoutingModule, HttpClientModule, + FormsModule, ], providers: [], bootstrap: [AppComponent] diff --git a/src/client/src/app/components/add-post/add-post.component.html b/src/client/src/app/components/add-post/add-post.component.html new file mode 100644 index 0000000..6aed3a3 --- /dev/null +++ b/src/client/src/app/components/add-post/add-post.component.html @@ -0,0 +1,16 @@ +

Posts

+ +

Title:

+ +
+

Subject:

+ +
+ + +
+ +
+ diff --git a/src/client/src/app/components/add-post/add-post.component.scss b/src/client/src/app/components/add-post/add-post.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/client/src/app/components/add-post/add-post.component.ts b/src/client/src/app/components/add-post/add-post.component.ts new file mode 100644 index 0000000..a08597d --- /dev/null +++ b/src/client/src/app/components/add-post/add-post.component.ts @@ -0,0 +1,24 @@ +import { PostService } from './../../services/post.service'; +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-add-post', + templateUrl: './add-post.component.html', + styleUrls: ['./add-post.component.scss'] +}) +export class AddPostComponent implements OnInit { + title!: string; + body!: string; + + constructor(private postService: PostService) { + + } + + ngOnInit(): void { + + } + + addPost(){ + return this.postService.addPost(this.title, this.body).subscribe(); + } +} diff --git a/src/client/src/app/components/add-user/add-user.component.html b/src/client/src/app/components/add-user/add-user.component.html new file mode 100644 index 0000000..0cc95d1 --- /dev/null +++ b/src/client/src/app/components/add-user/add-user.component.html @@ -0,0 +1,9 @@ +

Add User

+ +

+ Name: +

+

+ Email: +

+ diff --git a/src/client/src/app/components/add-user/add-user.component.scss b/src/client/src/app/components/add-user/add-user.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/client/src/app/components/add-user/add-user.component.ts b/src/client/src/app/components/add-user/add-user.component.ts new file mode 100644 index 0000000..cd1375d --- /dev/null +++ b/src/client/src/app/components/add-user/add-user.component.ts @@ -0,0 +1,24 @@ +import { Component, OnInit } from '@angular/core'; +import { UserService } from 'src/app/services/user.service'; + +@Component({ + selector: 'app-add-user', + templateUrl: './add-user.component.html', + styleUrls: ['./add-user.component.scss'] +}) +export class AddUserComponent implements OnInit { + name!: string; + email!: string; + + constructor(private userService: UserService) { + + } + + ngOnInit(): void { + } + + addUser(){ + this.userService.addUser(this.name, this.email).subscribe() + } + +} diff --git a/src/client/src/app/components/navigation/navigation.component.html b/src/client/src/app/components/navigation/navigation.component.html new file mode 100644 index 0000000..2ecf4bc --- /dev/null +++ b/src/client/src/app/components/navigation/navigation.component.html @@ -0,0 +1,5 @@ +

Full-Stack-Project

+ diff --git a/src/client/src/app/components/navigation/navigation.component.scss b/src/client/src/app/components/navigation/navigation.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/client/src/app/components/navigation/navigation.component.ts b/src/client/src/app/components/navigation/navigation.component.ts new file mode 100644 index 0000000..18be053 --- /dev/null +++ b/src/client/src/app/components/navigation/navigation.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-navigation', + templateUrl: './navigation.component.html', + styleUrls: ['./navigation.component.scss'] +}) +export class NavigationComponent implements OnInit { + + constructor() { } + + ngOnInit(): void { + } + +} diff --git a/src/client/src/app/model/post.ts b/src/client/src/app/model/post.ts new file mode 100644 index 0000000..5a16fff --- /dev/null +++ b/src/client/src/app/model/post.ts @@ -0,0 +1,4 @@ +export class Post { + title!: string; + body!: string; +} diff --git a/src/client/src/app/model/user.ts b/src/client/src/app/model/user.ts new file mode 100644 index 0000000..776d0c1 --- /dev/null +++ b/src/client/src/app/model/user.ts @@ -0,0 +1,4 @@ +export class User { + name!: string; + email!: string; +} diff --git a/src/client/src/app/services/api.service.ts b/src/client/src/app/services/api.service.ts index 8707bc8..713a7ff 100644 --- a/src/client/src/app/services/api.service.ts +++ b/src/client/src/app/services/api.service.ts @@ -6,10 +6,14 @@ import { Injectable } from '@angular/core'; }) export class ApiService { baseUrl:string = 'http://localhost:3501/'; - constructor(private http: HttpClient) + constructor(private http: HttpClient) { } get(resourceName: string) { return this.http.get(this.baseUrl + resourceName); } + + post(resourceName: string, data:D){ + return this.http.post(this.baseUrl + resourceName, data) + } } diff --git a/src/client/src/app/services/post.service.ts b/src/client/src/app/services/post.service.ts new file mode 100644 index 0000000..d1248ac --- /dev/null +++ b/src/client/src/app/services/post.service.ts @@ -0,0 +1,27 @@ +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs'; +import { Post } from '../model/post'; +import { ApiService } from './api.service'; + +@Injectable({ + providedIn: 'root' +}) +export class PostService { + posts$: Observable = new Observable(observer => { + observer.next([]) + }) + + constructor(private api: ApiService) { } + + getPosts(){ + this.posts$ = this.api.get('posts'); + } + + addPost(title:string, body:string){ + const post = new Post(); + post.title =title; + post.body = body; + + return this.api.post('create-post', post) + } +} diff --git a/src/client/src/app/services/user.service.ts b/src/client/src/app/services/user.service.ts new file mode 100644 index 0000000..01bbdf1 --- /dev/null +++ b/src/client/src/app/services/user.service.ts @@ -0,0 +1,27 @@ +import { User } from 'src/app/model/user'; +import { Observable } from 'rxjs'; +import { Injectable } from '@angular/core'; +import { ApiService } from './api.service'; + +@Injectable({ + providedIn: 'root' +}) +export class UserService { + + users$: Observable = new Observable(observer => { + observer.next([]); + }); + + constructor(private api: ApiService) { } + + getUsers(){ + this.users$ = this.api.get('users') + } + + addUser(name:string, email: string){ + const user = new User(); + user.name = name; + user.email = email; + return this.api.post('create-user', user); + } +} diff --git a/src/server/schema/post.schema.ts b/src/server/schema/post.schema.ts new file mode 100644 index 0000000..97e6fe0 --- /dev/null +++ b/src/server/schema/post.schema.ts @@ -0,0 +1,14 @@ +import mongoose from 'mongoose'; + +interface Post{ + title: string, + body: string, +} + +const PostSchema = new mongoose.Schema({ + title: {type: String, required: true}, + body: {type: String, required: true}, +}); + + +export const PostModel = mongoose.model('Post', PostSchema) \ No newline at end of file diff --git a/src/server/schema/user.schema.ts b/src/server/schema/user.schema.ts new file mode 100644 index 0000000..eb8689b --- /dev/null +++ b/src/server/schema/user.schema.ts @@ -0,0 +1,8 @@ +import mongoose from 'mongoose'; + +const UserSchema = new mongoose.Schema({ + name: {type: String, required: true}, + email: {type: String, required: true} +}); + +export const UserModel = mongoose.model('User', UserSchema ) \ No newline at end of file diff --git a/src/server/server.ts b/src/server/server.ts index 637d16b..8c6ab16 100644 --- a/src/server/server.ts +++ b/src/server/server.ts @@ -1,13 +1,26 @@ +import { UserModel } from './schema/user.schema.js'; +import { PostModel } from './schema/post.schema.js'; + import express from 'express'; import cors from 'cors'; -import fs from 'fs'; import path from 'path'; +import mongoose from 'mongoose'; const app = express(); const __dirname = path.resolve(); const PORT = 3501; + +mongoose.connect('mongodb://localhost:27017/test') +.then(() =>{ + console.log('Successfully connected to DB'); +}).catch(err => { + console.log(err, 'DB failed') +}) + + app.use(cors()); +app.use(express.json()); app.get('/', function(req, res) { @@ -15,10 +28,55 @@ app.get('/', function(req, res) { }); app.get('/users', function(req,res){ - res.sendFile(path.join(__dirname, 'users.json')); + UserModel.find() + .then(users => { + res.json({data:users}) + }).catch(err => { + res.status(501); + res.json({errors: err}) + }) +}); + +app.post('/create-user', function (req,res){ + const {name, email} = req.body; + const user = new UserModel({ + name, + email, + }); + user.save() + .then(data => { + res.json({data}); + }).catch(error =>{ + res.status(501); + res.json({errors:error}) + }) +}); + +app.get('/posts', function(req,res){ + PostModel.find() + .then(posts => { + res.json({data:posts}) + }).catch(err => { + res.status(501); + res.json({errors: err}) + }) +}); + +app.post('/create-post', function (req,res){ + const {title, body} = req.body; + const post = new PostModel({ + title, + body, + }); + post.save() + .then(data => { + res.json({data}); + }).catch(error =>{ + res.status(501).json({errors:error}) + }) }); app.listen(PORT, function(){ - console.log( `starting at localhost http://localhost: ${PORT}`); + console.log( `starting at localhost http://localhost:${PORT}`); })