Eight months ago, I worked as a customer service consultant and had nearly zero programming experience. This month, I had the opportunity to work remotely with a team of nine developers to build a full-stack web application for a real-world client: Family Promise. Yeah, my mind is blown too.
Family Promise is a charitable organization that helps families experiencing homelessness and low-income families achieve lasting independence through community response. My team was part of the second Lambda School cohort that helped develop a Family Promise Service Tracking app. The project aims to offer our stakeholders a way to monitor and evaluate their impact and track their services on the go. As a new developer, this was a daunting task; I didn't want to let down my first client!
The bumpiest bump in the road
I decided to work server-side and pair programmed with two teammates to implement new database and API features. The project was smooth until the front-end development team found a blocker in our service logs. At the time, the React application had to submit separate GET requests to four different database tables to display the necessary information.
I realized the need for a new database model to export customized functions that integrate data from service entries, recipients, service types and status tables. The most difficult part of the implementation of the new service entry model was to find the correct SQL query to successfully join the tables and then convert the query into Knex. After some pair programming and help from our team lead, here is how we solved this problem:
// OLD CODE
// This old knex query is too simple now
// and has to be used for each individual table
const findAll = async (table) => {
return await knex(table);
};
// NEW CODE
// This new knex query joins all needed tables in one call
// Efficiency at last!
const findAll = async () => {
return await knex('service_entries')
.leftJoin('recipients', {
'service_entries.recipient_id': 'recipients.id',
})
.rightJoin('service_types', {
'service_entries.service_type_id': 'service_types.id',
})
.rightJoin('statuses', {
'service_entries.status_id': 'statuses.id',
})
.select(
knex.raw(
'service_entries.*, to_json(recipients.*) as recipient, to_json(service_types.*) as service_type, to_json(statuses.*) as status'
)
)
.groupBy(
'service_entries.id',
'recipients.id',
'service_types.id',
'statuses.id'
);
};
I ship it
It is safe to say that the team successfully met the MVP roadmap in four weeks.
Here's a complete list of what we've shipped:
1. Tablet-First:
The application supports tablet screens for data entry and general application use and users can easily use the application on a computer.
2. Service Management:
Users can log a service into the system, check service logs, and edit or delete a service log.
3. Recipients:
Users can add a service recipient to the system, search for recipients, and edit or delete a recipient.
Users can also track recipients on an individual and household basis.
4. Metrics:
I built four simple endpoints and queries that fetch the following metrics:
- Amount of unique service recipients
- Amount of logged services
- New recipients created in the last 7 days
- New services completed in the last 7 days
It was an excellent ride, chaps
I am thrilled about where this app will go. The stakeholder’s main vision is to have a full-screen, interactive map for a Family Promise employee or volunteer to monitor and evaluate their service analytics. My team spent significant time laying down the foundations and designing future possible implementations for the next step in metrics, and I am pleased with our work.
Sadly, our time to work together on this project has come to a close. I am so grateful for the opportunity to offer the 950 hours of coding experience I gained during my time at Lambda School to Family Promise, and I hope my contribution brings them closer to their goal of changing the lives of one million children by 2030. I know that developing a service tracking application teaches relevant skills for professional web development, and I look forward to applying this knowledge to future projects.
Top comments (0)