Skip to content

Commit 13497ad

Browse files
author
Jason
committed
full CRUD functionality complete
1 parent b98ed63 commit 13497ad

File tree

7 files changed

+108
-68
lines changed

7 files changed

+108
-68
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ Data stored in MongoDB using Mongoose.
4747
| Task | Status |
4848
| -------- | ------ |
4949
| Client side interface | 100%
50-
| Node CRUD API | 80%
50+
| Node CRUD API | 100%
5151
| Pi Connection to Arduino | 0%
5252
| Arduino Program | 0%
5353
| Circuit prototype | 0%

client/src/app/app.service.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,13 @@ export class AppService {
3636
}
3737

3838
/**
39-
* Update gardens
40-
* @param {Array<Garden>} gardens
41-
* @returns {Array<Garden>} the saved gardens in the database.
39+
* Update garden
40+
* @param {Garden} garden
41+
* @returns {number} Amount of gardens updated
4242
*/
43-
putGardens(gardens: Array<Garden>): Observable<Array<Garden>> {
43+
putGarden(garden: Garden): Observable<number> {
4444
return this.http
45-
.put('/api/gardens', { gardens })
45+
.put('/api/gardens', { garden })
4646
.map(extractData)
4747
.catch(handleError);
4848
}

client/src/app/pages/home/home.component.html

+3-3
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ <h4 class="card-title d-flex align-items-center">
123123
<span [textContent]="garden.light?.toFixed(2)" [hidden]="edit"></span>
124124
<input type="number" class="form-control form-control-sm" [(ngModel)]="garden.light" [hidden]="!edit" />
125125
</td>
126-
<td class="text-right" [hidden]="!edit"><i class="fa fa-times danger hand" (click)="deleteGardens([garden._id])"></i></td>
126+
<td class="text-right" [hidden]="!edit"><i class="fa fa-times danger hand" (click)="tempDeleteGarden(garden._id)"></i></td>
127127
</tr>
128128
</tbody>
129129
</table>
@@ -132,8 +132,8 @@ <h4 class="card-title d-flex align-items-center">
132132
<div class="d-flex">
133133
<div class="ml-auto">
134134
<button class="btn btn-success hand" (click)="newGarden()">New</button>
135-
<button class="btn btn-primary hand" [hidden]="!edit" (click)="edit = !edit; putGardens()">Save</button>
136-
<button class="btn btn-secondary hand" [hidden]="!edit" (click)="edit = !edit; getGardens()">Cancel</button>
135+
<button class="btn btn-primary hand" [hidden]="!edit" (click)="edit = !edit; saveGardens()">Save</button>
136+
<button class="btn btn-secondary hand" [hidden]="!edit" (click)="edit = !edit; getGardens(); resetGardensToDelete()">Cancel</button>
137137
<button *ngIf="gardens?.length > 0" class="btn btn-primary hand" (click)="edit = !edit" [hidden]="edit">Edit <i class="fa fa-edit"></i></button>
138138
</div>
139139
</div>

client/src/app/pages/home/home.component.ts

+51-9
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ export class HomePageComponent implements OnInit {
2626
loading = false;
2727
gardens: Array<Garden>;
2828
params: Params;
29+
gardensToDelete: Array<string> = [];
2930

3031
constructor(
3132
public appService: AppService,
@@ -36,8 +37,7 @@ export class HomePageComponent implements OnInit {
3637
this.route.queryParams
3738
.mergeMap((params: Params) => {
3839
this.params = params;
39-
const date = moment(params.date).toDate().toISOString();
40-
return this.getGardens$(date);
40+
return this.getGardens$(params.date || new Date().toISOString());
4141
})
4242
.subscribe(gardens => {
4343
console.log(gardens)
@@ -53,26 +53,35 @@ export class HomePageComponent implements OnInit {
5353
.first()
5454
}
5555

56-
putGardens(gardens = this.gardens): void {
56+
/**
57+
* Update a garden
58+
* @param {Garden} garden The garden to update
59+
*/
60+
putGarden(garden: Garden): void {
5761
this.loading = true;
5862
this.appService
59-
.putGardens(this.gardens)
63+
.putGarden(garden)
6064
.first()
61-
.subscribe(gardens => {
62-
console.log(gardens);
65+
.subscribe(modifedCount => {
6366
this.loading = false;
64-
this.gardens = gardens;
6567
});
6668
}
6769

70+
/**
71+
* Get gardens
72+
*/
6873
getGardens(): void {
69-
this.getGardens$(this.params.date)
74+
this.getGardens$(this.params.date || new Date().toISOString())
7075
.subscribe(gardens => {
7176
this.loading = false;
7277
this.gardens = gardens;
7378
});
7479
}
7580

81+
/**
82+
* Delete gardens
83+
* @param {Array<string>} ids The array of ids to delete
84+
*/
7685
deleteGardens(ids: Array<string>): void {
7786
this.loading = true;
7887
this.appService
@@ -87,6 +96,10 @@ export class HomePageComponent implements OnInit {
8796
});
8897
}
8998

99+
/**
100+
* Insert new gardens
101+
* @param {Array<Garden>} gardens The array of Garden objects to insert
102+
*/
90103
postGardens(gardens: Array<Garden>): void {
91104
this.loading = true;
92105
this.appService
@@ -104,7 +117,36 @@ export class HomePageComponent implements OnInit {
104117

105118
newGarden(): void {
106119
const garden = new Garden();
107-
garden.date = moment(this.params.date || new Date()).toDate().toISOString();
120+
121+
if (this.params.date) {
122+
const now = new Date();
123+
const date = moment(this.params.date)
124+
.hours(now.getHours())
125+
.minutes(now.getMinutes())
126+
.seconds(now.getSeconds())
127+
.milliseconds(now.getMilliseconds());
128+
garden.date = date.toISOString();
129+
} else {
130+
garden.date = new Date().toISOString();
131+
}
108132
this.postGardens([garden]);
109133
}
134+
135+
saveGardens(): void {
136+
if (this.gardensToDelete.length > 0) {
137+
this.deleteGardens(this.gardensToDelete);
138+
this.resetGardensToDelete();
139+
}
140+
this.gardens.forEach(garden => this.putGarden(garden));
141+
}
142+
143+
// Remove garden from local array.
144+
tempDeleteGarden(id: string): void {
145+
this.gardensToDelete.push(id);
146+
this.gardens = this.gardens.filter(g => g._id !== id);
147+
}
148+
149+
resetGardensToDelete(): void {
150+
this.gardensToDelete = [];
151+
}
110152
}

client/src/app/pages/settings/settings.component.html

+1-30
Original file line numberDiff line numberDiff line change
@@ -3,36 +3,7 @@
33
<div class="col-lg-12" [style.marginTop]="'1em'">
44
<h2>Settings</h2>
55

6-
<div class="col-lg-4 col-md-6 col-sm-12">
7-
<form [formGroup]="manualForm" novalidate (ngSubmit)="submitManualForm()">
8-
<div class="form-group row">
9-
<label class="col-3 col-form-label">Temperature</label>
10-
<div class="col-9">
11-
<input class="form-control" type="number" placeholder="0" formControlName="temperature">
12-
</div>
13-
</div>
14-
<div class="form-group row">
15-
<label class="col-3 col-form-label">Moisture</label>
16-
<div class="col-9">
17-
<input class="form-control" type="number" placeholder="0" formControlName="moisture">
18-
</div>
19-
</div>
20-
<div class="form-group row">
21-
<label class="col-3 col-form-label">Humidity</label>
22-
<div class="col-9">
23-
<input class="form-control" type="number" placeholder="0" formControlName="humidity">
24-
</div>
25-
</div>
26-
<div class="form-group row">
27-
<label class="col-3 col-form-label">Light Level</label>
28-
<div class="col-9">
29-
<input class="form-control" type="number" placeholder="0" formControlName="light">
30-
</div>
31-
</div>
32-
33-
<button class="btn btn-danger" type="submit">Insert Manual Data</button>
34-
</form>
35-
</div>
6+
There are no settings here yet. Come back soon
367

378
</div>
389
</div>

logs/logs.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
All logs will be written to here.
1+
All logs will be written to this folder.

server.js

+46-19
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@ const moment = require('moment');
88
const ObjectId = mongoose.Types.ObjectId;
99
//const Garden = require('./models/garden');
1010

11-
const today = moment().format('YYYYMMDD')
12-
winston.add(winston.transports.File, { filename: `./logs/${today}.log` });
11+
winston.add(winston.transports.File, {
12+
filename: `./logs/${moment().format('YYYYMMDDHHmmSS')}.log`
13+
});
14+
1315
const DB_CONNECTION = 'mongodb://localhost/garden_db';
1416
let Garden;
1517

@@ -71,14 +73,20 @@ router
7173
{
7274
type: 'POST',
7375
route: `${BASE}/api/gardens`,
74-
params: `garden`,
75-
returns: '{Array<Garden>} An array of garden objects modified/inserted'
76+
params: `{Array<Garden>} gardens`,
77+
returns: '{Array<Garden>} An array of garden objects inserted'
78+
},
79+
{
80+
type: 'PUT',
81+
route: `${BASE}/api/gardens`,
82+
params: `{Garden} garden`,
83+
returns: '{number} Number of gardens updated'
7684
},
7785
{
7886
type: 'DELETE',
7987
route: `${BASE}/api/gardens`,
80-
params: `id`,
81-
returns: '{number} Documents deleted'
88+
params: `{Array<string>} ids`,
89+
returns: '{number} Number of gardens removed'
8290
}
8391
]
8492
});
@@ -92,6 +100,25 @@ router.route('/gardens')
92100
* @return {Array<Garden>}
93101
*/
94102
.get((req, res) => {
103+
104+
// If no date, return all gardens
105+
if (!req.query.date) {
106+
db.gardens
107+
.find({})
108+
.toArray()
109+
.then(val => {
110+
winston.info(`Found ${val.length} garden(s)`);
111+
res.json(val)
112+
})
113+
.catch(err => {
114+
winston.error(err);
115+
res.json(err);
116+
})
117+
118+
return;
119+
}
120+
121+
// Filter by request date
95122
const date = moment(req.query.date);
96123
const day = date.date();
97124
const month = date.month();
@@ -104,7 +131,7 @@ router.route('/gardens')
104131
.toArray()
105132
.then(val => {
106133
winston.info(`Found ${val.length} garden(s)`);
107-
res.json(val)
134+
res.json(val)
108135
})
109136
.catch(err => {
110137
winston.error(err);
@@ -137,29 +164,29 @@ router.route('/gardens')
137164
})
138165

139166
/**
140-
* Update gardens
141-
* @param {Array<Garden>} gardens
142-
* @return {Array<Garden>}
167+
* Update garden
168+
* @param {Garden} garden
169+
* @return {number} Modifeid count
143170
*/
144171
.put((req, res) => {
145-
const gardens = req.body.gardens.map(g => {
146-
const garden = new Garden();
147-
garden.date = g.date;
148-
return garden;
149-
});
172+
const { garden } = req.body;
173+
const { temperature, moisture, humidity, light } = garden;
150174

151175
db.gardens
152-
.updateMany(gardens, gardens)
176+
.updateOne({ _id: ObjectId(garden._id) }, { $set: {
177+
temperature,
178+
moisture,
179+
humidity,
180+
light
181+
}})
153182
.then(val => {
154183
winston.info(`Updated ${val.modifiedCount} garden(s)`);
155-
res.json(val.ops)
184+
res.json(val.modifiedCount)
156185
})
157186
.catch(err => {
158187
winston.error(err);
159188
res.json(err);
160189
});
161-
162-
res.json(gardens);
163190
})
164191

165192
/**

0 commit comments

Comments
 (0)