# Update database, Add scheduler and scheduled job
### Unit Test

### Updated database

### Updated controller and routes
```typescript=
export const setExpiredDonationSql = `
UPDATE donation_items
SET
status = 'Closed'
WHERE
expired_date < now() AND status='Ongoing'
RETURNING id`;
createDonationItem = (donationItem: DonationItem) => {
return new Promise((resolve, reject) => {
// Generate Donation ID
var donationId = "DN-" + this.nanoid();
// Insert donation item to database
db.oneOrNone(insertDonationItemSql, [
donationId,
donationItem.getUid(),
donationItem.getTitle(),
donationItem.getDescription(),
donationItem.getTotalNominal(),
donationItem.getImageUrl(),
donationItem.getExpiredDate(),
])
.then((data: any) => resolve(data))
.catch((error: any) => reject(error));
});
};
updateDonationItem = (donationItem: DonationItem) => {
return new Promise((resolve, reject) => {
// Update donation item in database
db.oneOrNone(updateDonationItemSql, [
donationItem.getTitle(),
donationItem.getDescription(),
donationItem.getTotalNominal(),
donationItem.getImageUrl(),
donationItem.getExpiredDate(),
donationItem.getId(),
donationItem.getUid(),
])
.then((data: any) => resolve(data))
.catch((error: any) => reject(error));
});
};
setExpiredDonation = () => {
return new Promise((resolve, reject) => {
db.manyOrNone(setExpiredDonationSql)
.then((data: any) => (data.length > 0 ? resolve(true) : resolve(false)))
.catch((error: any) => reject(error));
});
};
```
### Sceduler and Sceduled job
```typescript=
// Initialize cron job
// Check expired donation at 00.05 everyday
const job = new CronJob(
"5 0 * * * *", // CRON string
() => {
new DonationController()
.setExpiredDonation()
.then((data: any) =>
console.log(
(data as boolean)
? "Success update expired data"
: "No expired donation items"
)
);
},
() => {
console.log("task completed" as string);
}
);
// Start cron job
job.start();
console.log("CronJob started");
```