Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions part9/calculators/.eslintrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"extends": [
"eslint:recommended",
"plugin:@typescript-eslint/recommended",
"plugin:@typescript-eslint/recommended-requiring-type-checking"
],
"plugins": ["@typescript-eslint"],
"env": {
"node": true,
"es6": true
},
"rules": {
"@typescript-eslint/semi": ["error"],
"@typescript-eslint/no-explicit-any": 2,
"@typescript-eslint/explicit-function-return-type": 0,
"@typescript-eslint/no-unused-vars": ["error", { "argsIgnorePattern": "^_" }],
"no-case-declarations": 0
},
"parser": "@typescript-eslint/parser",
"parserOptions": {
"project": "./tsconfig.json"
}
}
39 changes: 39 additions & 0 deletions part9/calculators/bmiCalculator.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
const calculateBmi = (height: number, weight: number): string => {
const bmi = weight / Math.pow(height/100, 2);

if (bmi < 15) return 'Very severely underweight';
if (bmi >= 15 && bmi < 16) return 'Severely underweight';
if (bmi >= 16 && bmi < 18.5) return 'Underweight';
if (bmi >= 18.5 && bmi < 25) return 'Normal (healthy weight)';
if (bmi >= 25 && bmi < 30) return 'Overweight';
if (bmi >= 30 && bmi < 35) return 'Obese Class I (Moderately obese)';
if (bmi >= 35 && bmi < 40) return 'Obese Class II (Severely obese)';
return 'Obese Class III (Very severely obese)';
};

interface arguments {
height: number;
weight: number;
}

const parseArguments = (args: Array<string>): arguments => {
if (args.length < 4) throw new Error('Not enough arguments');

if (!isNaN(Number(args[2])) && !isNaN(Number(args[3]))) {
return {
height: Number(args[2]),
weight: Number(args[3]),
};
} else {
throw new Error('Provided values were not numbers!');
}
};

try {
const { height, weight } = parseArguments(process.argv);
console.log(calculateBmi(height, weight));
} catch (error) {
console.log(error);
}

export { calculateBmi };
72 changes: 72 additions & 0 deletions part9/calculators/exerciseCalculator.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
interface result {
periodLength: number
trainingDays: number
success: boolean
rating: number
ratingDescription: string
target: number
average: number
}

const exerciseCalculator = (targetDailyHours: number, dailyExerciseHours: number[]): result => {
const totalExerciseHours = dailyExerciseHours.reduce((a, b) => a + b, 0);
const averageTrainingHours = totalExerciseHours / dailyExerciseHours.length;

let exerciseRating = 1;
let exerciseRatingDescription = 'Could be better.';
if (averageTrainingHours >= targetDailyHours) {
exerciseRating = 3;
exerciseRatingDescription = 'Perfect!';
}
else if (averageTrainingHours >= targetDailyHours * (2/3)) {
exerciseRating = 2;
exerciseRatingDescription = 'Almost there!';
}

return {
periodLength: dailyExerciseHours.length,
trainingDays: dailyExerciseHours.filter(Number).length,
success: averageTrainingHours >= targetDailyHours,
rating: exerciseRating,
ratingDescription: exerciseRatingDescription,
target: targetDailyHours,
average: averageTrainingHours
};
};

interface arguments {
targetDailyHours: number,
dailyHours: number[]
}

const parseArguments = (args: Array<string>): arguments => {
if (args.length < 4) throw new Error('Not enough arguments');

if (isNaN(Number(args[2]))) {
throw new Error('First argument is not a number');
}

const hourArgs = args.slice(3);
const dailyHours: number[] = [];

hourArgs.forEach((arg) => {
if (isNaN(Number(arg))) {
throw new Error('At least of the provided values is not a number!');
}
dailyHours.push(Number(arg));
});

return{
targetDailyHours: Number(args[2]),
dailyHours
};
};

try {
const { targetDailyHours, dailyHours } = parseArguments(process.argv);
console.log(exerciseCalculator(targetDailyHours, dailyHours));
} catch (error) {
console.log(error);
}

export { exerciseCalculator }
47 changes: 47 additions & 0 deletions part9/calculators/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import express from 'express';
import { calculateBmi } from './bmiCalculator';
import { exerciseCalculator } from './exerciseCalculator';
const app = express();

app.use(express.json());

app.get('/hello', (_req, res) => {
res.send('Hello Full Stack!');
});

app.get('/bmi', (req, res) => {
const height = Number(req.query.height);
const weight = Number(req.query.weight);

if (weight && height) {
res.json({
weight,
height,
bmi: `${calculateBmi(height, weight)}`
});
} else {
res.status(400).json({ error: 'malformatted parameters' });
}
});

app.get('/exercises', (req, res) => {

// eslint-disable-next-line @typescript-eslint/no-explicit-any
const { daily_exercises, target } = req.body;

if (!daily_exercises || !target) {
res.status(400).send({ error: 'parameters missing' });
} else if (!Array.isArray(daily_exercises) || daily_exercises.some(isNaN) || isNaN(Number(target))) {
res.status(400).send({ error: 'malformatted parameters' });
} else {
res.json(exerciseCalculator(target, daily_exercises));
}


});

const PORT = 3003;

app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
});
Loading