Files
build-your-own-x/tutorials/fitness-app.md
scarruth1872 f27f6c28fc Add tutorial for building a fitness app
Add a new tutorial for building a fitness app similar to Fitbud.

* **README.md**
  - Add a new section "Build your own Fitness App".
  - Add a link to the new tutorial for building a fitness app.
  - Add a brief description of the fitness app tutorial.

* **ISSUE_TEMPLATE.md**
  - Add a new category "Fitness App" to the list of categories.

* **tutorials/fitness-app.md**
  - Create a new file for the fitness app tutorial.
  - Add a step-by-step guide for building a fitness app similar to Fitbud.
  - Include code snippets and explanations for each step.
  - Add links to relevant resources and documentation.

---

For more details, open the [Copilot Workspace session](https://copilot-workspace.githubnext.com/codecrafters-io/build-your-own-x?shareId=XXXX-XXXX-XXXX-XXXX).
2024-12-02 14:48:52 -05:00

5.1 KiB

Build a Simple Fitness App

In this tutorial, we will build a simple fitness app similar to Fitbud. The app will allow users to track their workouts, set goals, and monitor their progress. We will use JavaScript and a few other technologies to create this app.

Step 1: Setting Up the Project

First, let's set up our project. Create a new directory for your project and initialize a new Node.js project:

mkdir fitness-app
cd fitness-app
npm init -y

Next, install the necessary dependencies:

npm install express body-parser mongoose

Step 2: Creating the Server

We will use Express to create our server. Create a new file called server.js and add the following code:

const express = require('express');
const bodyParser = require('body-parser');
const mongoose = require('mongoose');

const app = express();
const port = 3000;

app.use(bodyParser.json());

mongoose.connect('mongodb://localhost/fitness-app', { useNewUrlParser: true, useUnifiedTopology: true });

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

Step 3: Creating the User Model

We will use Mongoose to create our user model. Create a new file called models/User.js and add the following code:

const mongoose = require('mongoose');

const userSchema = new mongoose.Schema({
  username: { type: String, required: true, unique: true },
  password: { type: String, required: true },
  workouts: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Workout' }]
});

const User = mongoose.model('User', userSchema);

module.exports = User;

Step 4: Creating the Workout Model

Next, create a new file called models/Workout.js and add the following code:

const mongoose = require('mongoose');

const workoutSchema = new mongoose.Schema({
  user: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true },
  date: { type: Date, required: true },
  exercises: [{
    name: { type: String, required: true },
    sets: { type: Number, required: true },
    reps: { type: Number, required: true },
    weight: { type: Number, required: true }
  }]
});

const Workout = mongoose.model('Workout', workoutSchema);

module.exports = Workout;

Step 5: Creating the User Routes

Create a new file called routes/user.js and add the following code:

const express = require('express');
const router = express.Router();
const User = require('../models/User');

router.post('/register', async (req, res) => {
  try {
    const user = new User(req.body);
    await user.save();
    res.status(201).send(user);
  } catch (error) {
    res.status(400).send(error);
  }
});

router.post('/login', async (req, res) => {
  try {
    const user = await User.findOne({ username: req.body.username, password: req.body.password });
    if (!user) {
      return res.status(401).send({ error: 'Invalid credentials' });
    }
    res.send(user);
  } catch (error) {
    res.status(400).send(error);
  }
});

module.exports = router;

Step 6: Creating the Workout Routes

Create a new file called routes/workout.js and add the following code:

const express = require('express');
const router = express.Router();
const Workout = require('../models/Workout');

router.post('/', async (req, res) => {
  try {
    const workout = new Workout(req.body);
    await workout.save();
    res.status(201).send(workout);
  } catch (error) {
    res.status(400).send(error);
  }
});

router.get('/:userId', async (req, res) => {
  try {
    const workouts = await Workout.find({ user: req.params.userId });
    res.send(workouts);
  } catch (error) {
    res.status(400).send(error);
  }
});

module.exports = router;

Step 7: Integrating the Routes

Update the server.js file to include the user and workout routes:

const express = require('express');
const bodyParser = require('body-parser');
const mongoose = require('mongoose');
const userRoutes = require('./routes/user');
const workoutRoutes = require('./routes/workout');

const app = express();
const port = 3000;

app.use(bodyParser.json());

mongoose.connect('mongodb://localhost/fitness-app', { useNewUrlParser: true, useUnifiedTopology: true });

app.use('/users', userRoutes);
app.use('/workouts', workoutRoutes);

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

Step 8: Testing the API

You can use a tool like Postman to test the API. Here are some example requests:

Conclusion

Congratulations! You have built a simple fitness app similar to Fitbud. You can now extend this app by adding more features such as goal tracking, progress monitoring, and more. Happy coding!