Skip to content

Commit b8bc08e

Browse files
committed
refactoring
1 parent ec0c479 commit b8bc08e

19 files changed

+184
-79
lines changed

angular.json

+6-6
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"version": 1,
44
"newProjectRoot": "projects",
55
"projects": {
6-
"image-upload": {
6+
"post-creator": {
77
"projectType": "application",
88
"schematics": {},
99
"root": "",
@@ -13,7 +13,7 @@
1313
"build": {
1414
"builder": "@angular-devkit/build-angular:browser",
1515
"options": {
16-
"outputPath": "dist/image-upload",
16+
"outputPath": "dist/post-creator",
1717
"index": "src/index.html",
1818
"main": "src/main.ts",
1919
"polyfills": "src/polyfills.ts",
@@ -65,18 +65,18 @@
6565
"builder": "@angular-devkit/build-angular:dev-server",
6666
"configurations": {
6767
"production": {
68-
"browserTarget": "image-upload:build:production"
68+
"browserTarget": "post-creator:build:production"
6969
},
7070
"development": {
71-
"browserTarget": "image-upload:build:development"
71+
"browserTarget": "post-creator:build:development"
7272
}
7373
},
7474
"defaultConfiguration": "development"
7575
},
7676
"extract-i18n": {
7777
"builder": "@angular-devkit/build-angular:extract-i18n",
7878
"options": {
79-
"browserTarget": "image-upload:build"
79+
"browserTarget": "post-creator:build"
8080
}
8181
},
8282
"test": {
@@ -100,5 +100,5 @@
100100
}
101101
}
102102
},
103-
"defaultProject": "image-upload"
103+
"defaultProject": "post-creator"
104104
}

backend/app.js

+8-39
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
const express = require("express");
22
const parser = require("body-parser");
33
const mongoose = require("mongoose");
4-
const Post = require("./models/post");
54

6-
require('dotenv/config');
5+
const postsRoutes = require("./routes/posts");
6+
7+
require("dotenv/config");
78

89
const app = express();
910

1011
mongoose
11-
.connect(
12-
process.env.DB_CONNECTION,
13-
{ useNewUrlParser: true, useUnifiedTopology: true }
14-
)
12+
.connect(process.env.DB_CONNECTION, {
13+
useNewUrlParser: true,
14+
useUnifiedTopology: true,
15+
})
1516
.then(() => {
1617
console.log("Connected to database!");
1718
})
@@ -34,38 +35,6 @@ app.use((req, res, next) => {
3435
next();
3536
});
3637

37-
app.get("/api/posts", (req, res) => {
38-
Post.find()
39-
.then((posts) => {
40-
res.status(200).json({
41-
message: "Posts fetched successfully",
42-
data: posts,
43-
});
44-
})
45-
.catch((err) => {
46-
console.log(err);
47-
});
48-
});
49-
50-
app.post("/api/posts", (req, res) => {
51-
const post = new Post({
52-
title: req.body.title,
53-
content: req.body.content,
54-
});
55-
post.save();
56-
57-
res.status(201).json({
58-
message: "Post saved successfully",
59-
});
60-
});
61-
62-
app.delete("/api/posts/:id", (req, res) => {
63-
Post.deleteOne({_id : req.params.id}).then(()=>{
64-
res.status(200).json({ message: "Post deleted succesffully" });
65-
}).catch((err)=>{
66-
console.log(err)
67-
});
68-
69-
});
38+
app.use('/api/posts', postsRoutes);
7039

7140
module.exports = app;

backend/routes/posts.js

+71
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
const express = require('express')
2+
const Post = require("../models/post");
3+
4+
const router = express.Router()
5+
6+
router.get("", (req, res) => {
7+
Post.find()
8+
.then((posts) => {
9+
res.status(200).json({
10+
message: "Posts fetched successfully",
11+
data: posts,
12+
});
13+
})
14+
.catch((err) => {
15+
console.log(err);
16+
});
17+
});
18+
19+
router.get("/:id", (req, res) => {
20+
Post.findById(req.params.id)
21+
.then((post) => {
22+
res.status(200).json({
23+
message: "Posts fetched successfully",
24+
data: post,
25+
});
26+
})
27+
.catch((err) => {
28+
console.log(err);
29+
});
30+
});
31+
32+
router.post("", (req, res) => {
33+
const post = new Post({
34+
title: req.body.title,
35+
content: req.body.content,
36+
});
37+
post.save();
38+
39+
res.status(201).json({
40+
message: "Post saved successfully",
41+
});
42+
});
43+
44+
router.put("/:id", (req, res) => {
45+
const post = new Post({
46+
_id: req.params.id,
47+
title: req.body.title,
48+
content: req.body.content,
49+
});
50+
51+
Post.updateOne({ _id: req.params.id }, post)
52+
.then(() => {
53+
res.status(201).json({
54+
message: "Post updated successfully",
55+
});
56+
})
57+
.catch((err) => {
58+
console.log(err);
59+
});
60+
});
61+
62+
router.delete("/:id", (req, res) => {
63+
Post.deleteOne({_id : req.params.id}).then(()=>{
64+
res.status(200).json({ message: "Post deleted succesffully" });
65+
}).catch((err)=>{
66+
console.log(err)
67+
});
68+
69+
});
70+
71+
module.exports = router;

karma.conf.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ module.exports = function (config) {
2525
suppressAll: true // removes the duplicated traces
2626
},
2727
coverageReporter: {
28-
dir: require('path').join(__dirname, './coverage/image-upload'),
28+
dir: require('path').join(__dirname, './coverage/post-creator'),
2929
subdir: '.',
3030
reporters: [
3131
{ type: 'html' },

package-lock.json

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"name": "image-upload",
2+
"name": "post-creator",
33
"version": "0.0.0",
44
"scripts": {
55
"ng": "ng",

src/app/app-routing.module.ts

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { PostListComponent } from './posts/post-list/post-list.component';
66
export const routes: Routes = [
77
{ path: '', component: PostListComponent },
88
{ path: 'new', component: PostCreateComponent },
9+
{ path: 'edit/:id', component: PostCreateComponent },
910
];
1011

1112
@NgModule({

src/app/app.component.spec.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,16 @@ describe('AppComponent', () => {
1616
expect(app).toBeTruthy();
1717
});
1818

19-
it(`should have as title 'image-upload'`, () => {
19+
it(`should have as title 'post-creator'`, () => {
2020
const fixture = TestBed.createComponent(AppComponent);
2121
const app = fixture.componentInstance;
22-
expect(app.title).toEqual('image-upload');
22+
expect(app.title).toEqual('post-creator');
2323
});
2424

2525
it('should render title', () => {
2626
const fixture = TestBed.createComponent(AppComponent);
2727
fixture.detectChanges();
2828
const compiled = fixture.nativeElement as HTMLElement;
29-
expect(compiled.querySelector('.content span')?.textContent).toContain('image-upload app is running!');
29+
expect(compiled.querySelector('.content span')?.textContent).toContain('post-creator app is running!');
3030
});
3131
});

src/app/app.component.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@ import { Component } from '@angular/core';
66
styleUrls: ['./app.component.css'],
77
})
88
export class AppComponent {
9-
title = 'image-upload';
9+
title = 'post-creator';
1010
}

src/app/app.module.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { MatButtonModule } from '@angular/material/button';
88
import { MatCardModule } from '@angular/material/card';
99
import { MatExpansionModule } from '@angular/material/expansion';
1010
import { MatInputModule } from '@angular/material/input';
11+
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
1112
import { MatToolbarModule } from '@angular/material/toolbar';
1213

1314
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
@@ -28,7 +29,8 @@ import { PostListComponent } from './posts/post-list/post-list.component';
2829
MatCardModule,
2930
MatButtonModule,
3031
MatToolbarModule,
31-
MatExpansionModule
32+
MatExpansionModule,
33+
MatProgressSpinnerModule
3234
],
3335
providers: [],
3436
bootstrap: [AppComponent],

src/app/posts/post-create/post-create.component.css

+4
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,7 @@ mat-form-field,
22
textarea{
33
width: 100%;
44
}
5+
6+
mat-spinner{
7+
margin: auto;
8+
}
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
11
<mat-card>
2-
<form (submit)="onSavePost(postForm)" #postForm="ngForm">
2+
<mat-spinner *ngIf="isLoading"></mat-spinner>
3+
<form (submit)="onSavePost(postForm)" #postForm="ngForm" *ngIf="!isLoading">
34
<mat-form-field appearance="fill">
45
<mat-label>Title</mat-label>
5-
<input matInput type="text" ngModel name="title" required #title="ngModel"/>
6+
<input matInput type="text" [ngModel]="post?.title" name="title" required #title="ngModel"/>
67
<mat-error *ngIf="title.invalid">Please enter a title</mat-error>
78
</mat-form-field>
89

910
<mat-form-field appearance="fill">
1011
<mat-label>Content</mat-label>
11-
<textarea matInput ngModel name="content" required #content="ngModel"></textarea>
12+
<textarea matInput [ngModel]="post?.content" name="content" required #content="ngModel"></textarea>
1213
<mat-error *ngIf="content.invalid">Please enter the content</mat-error>
1314
</mat-form-field>
1415

1516
<button mat-raised-button color="primary" type="submit">
16-
Save Post
17+
{{ post ? 'Update Post' : 'Save Post' }}
1718
</button>
1819
</form>
1920
</mat-card>
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { Component, OnInit } from '@angular/core';
22
import { NgForm } from '@angular/forms';
3+
import { ActivatedRoute, ParamMap } from '@angular/router';
34
import { PostsService } from '../posts.service';
45
import { Post } from './../post.model';
56

@@ -9,10 +10,29 @@ import { Post } from './../post.model';
910
styleUrls: ['./post-create.component.css'],
1011
})
1112
export class PostCreateComponent implements OnInit {
13+
id: string;
14+
post: Post;
15+
isLoading = false;
1216

13-
constructor(public postService: PostsService) {}
17+
constructor(public postService: PostsService, public route: ActivatedRoute) {}
1418

15-
ngOnInit(): void {}
19+
ngOnInit(): void {
20+
this.route.paramMap.subscribe((paramMap: ParamMap) => {
21+
if (paramMap.has('id')) {
22+
this.isLoading = true;
23+
this.id = paramMap.get('id');
24+
this.postService.getPostDetails(this.id).subscribe({
25+
next: (data: any) => {
26+
this.post = data.data;
27+
},
28+
error: (err: any) => {
29+
console.log(err);
30+
},
31+
complete: () => {this.isLoading=false},
32+
});
33+
}
34+
});
35+
}
1636

1737
onSavePost(form: NgForm) {
1838
if (form.valid) {
@@ -22,9 +42,13 @@ export class PostCreateComponent implements OnInit {
2242
content: form.value.content,
2343
};
2444

25-
this.postService.addPost(post)
45+
if (this.id != null || this.id != undefined) {
46+
this.postService.updatePost(this.id, post);
47+
} else {
48+
this.postService.addPost(post);
49+
}
2650

27-
form.resetForm()
51+
form.resetForm();
2852
}
2953
}
3054
}

src/app/posts/post-list/post-list.component.css

+4
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,7 @@
66
.info-text{
77
text-align: center;
88
}
9+
10+
mat-spinner{
11+
margin: auto;
12+
}
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
<mat-accordion multi="true" *ngIf="posts.length > 0">
1+
<mat-spinner *ngIf="isLoading"></mat-spinner>
2+
3+
4+
<mat-accordion multi="true" *ngIf="posts.length > 0 && !isLoading">
25
<mat-expansion-panel *ngFor="let post of posts">
36
<mat-expansion-panel-header>
47
<mat-panel-title>
@@ -7,10 +10,10 @@
710
</mat-expansion-panel-header>
811
<p>{{post.content}}</p>
912
<mat-action-row>
10-
<button mat-button color="primary">EDIT</button>
13+
<button [routerLink]="['/edit', post.id]" routerLinkActive="router-link-active" mat-button color="primary">EDIT</button>
1114
<button mat-button color="warn" (click)="onDelete(post.id)">DELETE</button>
1215
</mat-action-row>
1316
</mat-expansion-panel>
1417
</mat-accordion>
1518

16-
<p class="mat-body-2 info-text" *ngIf="posts.length < 1">No posts added yet</p>
19+
<p class="mat-body-2 info-text" *ngIf="posts.length < 1 && !isLoading">No posts added yet</p>

0 commit comments

Comments
 (0)