renamed
This commit is contained in:
@@ -0,0 +1,17 @@
|
||||
import express from 'express';
|
||||
const app = express();
|
||||
import diaryRouter from './routes/diaries';
|
||||
app.use(express.json());
|
||||
|
||||
const PORT = 3003;
|
||||
|
||||
app.get('/ping', (_req, res) => {
|
||||
console.log('someone pinged here');
|
||||
res.send('pong');
|
||||
});
|
||||
|
||||
app.use('/api/diaries', diaryRouter);
|
||||
|
||||
app.listen(PORT, () => {
|
||||
console.log(`Server running on port ${PORT}`);
|
||||
});
|
||||
@@ -0,0 +1,37 @@
|
||||
import express from 'express';
|
||||
|
||||
import diaryService from '../services/diaryService';
|
||||
|
||||
import toNewDiaryEntry from '../utils';
|
||||
|
||||
const router = express.Router();
|
||||
|
||||
router.get('/', (_req, res) => {
|
||||
res.send(diaryService.getNonSensitiveEntries());
|
||||
});
|
||||
|
||||
router.get('/:id', (req, res) => {
|
||||
const diary = diaryService.findById(Number(req.params.id));
|
||||
|
||||
if (diary) {
|
||||
res.send(diary);
|
||||
} else {
|
||||
res.sendStatus(404);
|
||||
}
|
||||
});
|
||||
|
||||
router.post('/', (req, res) => {
|
||||
try {
|
||||
const newDiaryEntry = toNewDiaryEntry(req.body);
|
||||
const addedEntry = diaryService.addDiary(newDiaryEntry);
|
||||
res.json(addedEntry);
|
||||
} catch (error: unknown) {
|
||||
let errorMessage = 'Something went wrong.';
|
||||
if (error instanceof Error) {
|
||||
errorMessage += ' Error: ' + error.message;
|
||||
}
|
||||
res.status(400).send(errorMessage);
|
||||
}
|
||||
});
|
||||
|
||||
export default router;
|
||||
@@ -0,0 +1,42 @@
|
||||
import diaryData from '../../data/entries';
|
||||
|
||||
import {
|
||||
NonSensitiveDiaryEntry, DiaryEntry, NewDiaryEntry
|
||||
} from '../types';
|
||||
|
||||
const diaries: DiaryEntry[] = diaryData;
|
||||
|
||||
const getEntries = (): DiaryEntry[] => {
|
||||
return diaries;
|
||||
};
|
||||
|
||||
const getNonSensitiveEntries = (): NonSensitiveDiaryEntry[] => {
|
||||
return diaries.map(({ id, date, weather, visibility }) => ({
|
||||
id,
|
||||
date,
|
||||
weather,
|
||||
visibility,
|
||||
}));
|
||||
};
|
||||
|
||||
const findById = (id: number): DiaryEntry | undefined => {
|
||||
const entry = diaries.find(d => d.id === id);
|
||||
return entry;
|
||||
};
|
||||
|
||||
const addDiary = ( entry: NewDiaryEntry ): DiaryEntry => {
|
||||
const newDiaryEntry = {
|
||||
id: Math.max(...diaries.map(d => d.id)) + 1,
|
||||
...entry
|
||||
};
|
||||
|
||||
diaries.push(newDiaryEntry);
|
||||
return newDiaryEntry;
|
||||
};
|
||||
|
||||
export default {
|
||||
getEntries,
|
||||
addDiary,
|
||||
getNonSensitiveEntries,
|
||||
findById
|
||||
};
|
||||
@@ -0,0 +1,26 @@
|
||||
export enum Weather {
|
||||
Sunny = 'sunny',
|
||||
Rainy = 'rainy',
|
||||
Cloudy = 'cloudy',
|
||||
Stormy = 'stormy',
|
||||
Windy = 'windy',
|
||||
}
|
||||
|
||||
export enum Visibility {
|
||||
Great = 'great',
|
||||
Good = 'good',
|
||||
Ok = 'ok',
|
||||
Poor = 'poor',
|
||||
}
|
||||
|
||||
export interface DiaryEntry {
|
||||
id: number;
|
||||
date: string;
|
||||
weather: Weather;
|
||||
visibility: Visibility;
|
||||
comment: string;
|
||||
}
|
||||
|
||||
export type NewDiaryEntry = Omit<DiaryEntry, 'id'>;
|
||||
|
||||
export type NonSensitiveDiaryEntry = Omit<DiaryEntry, 'comment'>;
|
||||
@@ -0,0 +1,68 @@
|
||||
|
||||
import { NewDiaryEntry, Weather, Visibility } from './types';
|
||||
|
||||
const isString = (text: unknown): text is string => {
|
||||
return typeof text === 'string' || text instanceof String;
|
||||
};
|
||||
|
||||
const parseComment = (comment: unknown): string => {
|
||||
if (!isString(comment)) {
|
||||
throw new Error('Incorrect or missing comment');
|
||||
}
|
||||
|
||||
return comment;
|
||||
};
|
||||
|
||||
const isDate = (date: string): boolean => {
|
||||
return Boolean(Date.parse(date));
|
||||
};
|
||||
|
||||
const parseDate = (date: unknown): string => {
|
||||
if (!isString(date) || !isDate(date)) {
|
||||
throw new Error('Incorrect date: ' + date);
|
||||
}
|
||||
return date;
|
||||
};
|
||||
|
||||
const isWeather = (param: string): param is Weather => {
|
||||
return Object.values(Weather).map(v => v.toString()).includes(param);
|
||||
};
|
||||
|
||||
const parseWeather = (weather: unknown): Weather => {
|
||||
if (!isString(weather) || !isWeather(weather)) {
|
||||
throw new Error('Incorrect weather: ' + weather);
|
||||
}
|
||||
return weather;
|
||||
};
|
||||
|
||||
const isVisibility = (param: string): param is Visibility => {
|
||||
return Object.values(Visibility).map(v => v.toString()).includes(param);
|
||||
};
|
||||
|
||||
const parseVisibility = (visibility: unknown): Visibility => {
|
||||
if (!isString(visibility) || !isVisibility(visibility)) {
|
||||
throw new Error('Incorrect visibility: ' + visibility);
|
||||
}
|
||||
return visibility;
|
||||
};
|
||||
|
||||
const toNewDiaryEntry = (object: unknown): NewDiaryEntry => {
|
||||
if ( !object || typeof object !== 'object' ) {
|
||||
throw new Error('Incorrect or missing data');
|
||||
}
|
||||
|
||||
if ('comment' in object && 'date' in object && 'weather' in object && 'visibility' in object) {
|
||||
const newEntry: NewDiaryEntry = {
|
||||
weather: parseWeather(object.weather),
|
||||
visibility: parseVisibility(object.visibility),
|
||||
date: parseDate(object.date),
|
||||
comment: parseComment(object.comment)
|
||||
};
|
||||
|
||||
return newEntry;
|
||||
}
|
||||
|
||||
throw new Error('Incorrect data: a field missing');
|
||||
};
|
||||
|
||||
export default toNewDiaryEntry;
|
||||
Reference in New Issue
Block a user