Back to projects

Team Project · Software Engineering

GiftWise

GiftWise is a collaborative Ruby on Rails application designed to make gift planning easier. Users can create recipient profiles, organize events and budgets, track gift ideas through different stages, and request AI-generated suggestions based on a recipient's interests and personal details.

RubyRuby on RailsRSpecCucumber
GiftWise gift-box logo representing the gift-planning application
GiftWise project

Project overview

Making Gift Planning More Personal and Organized

GiftWise brings several parts of gift planning into one database-backed web application. Instead of keeping recipient details, event dates, budgets, and gift ideas in separate places, users can organize them through connected profiles, events, and gift lists.

The application can use recipient information such as age range, relationship, occupation, hobbies, likes, dislikes, and additional notes to request personalized gift suggestions from OpenAI. Users can then organize their ideas and track gifts from an initial idea through planning, ordering, wrapping, and giving.

For me, the project was an opportunity to learn Ruby and Ruby on Rails while working within a larger team codebase. It provided practical experience with Rails conventions, MVC architecture, Active Record relationships, database migrations, authentication, validation, automated testing, API integration, and collaborative Git workflows.

My contributions

Recipient Profiles, User Features, and Budget Planning

My work focused primarily on the recipient and user-management experience. I helped develop the information used to personalize gift suggestions, including birthdays, age ranges, occupations, hobbies, and other recipient details. I also contributed event-recipient budget functionality, account features, Google authentication setup, automated tests, validation, and ongoing bug fixes.

  • Implemented recipient creation, viewing, editing, and deletion
  • Added recipient database relationships
  • Added birthday support and automatic age calculation
  • Developed selectable age-range functionality
  • Added occupation, hobbies, and additional recipient information
  • Added recipient validations and user-facing error messages
  • Implemented event-recipient budget tracking
  • Added user signup and profile-editing functionality
  • Contributed Google OAuth configuration and authentication routes
  • Added and updated model, controller, request, and view tests
  • Fixed bugs, routing problems, merge issues, and lint errors

User flow

From Recipient Profile to Completed Gift

GiftWise connects recipient data, event planning, and gift tracking into one workflow:

  1. 1Create an account
  2. 2Add a recipient
  3. 3Record interests and personal details
  4. 4Create or select an event
  5. 5Set a budget
  6. 6Generate or add gift ideas
  7. 7Compare product offers
  8. 8Track the gift's status
  9. 9Mark the gift as given

These features are connected through Rails models and database relationships.

Personalization

Building Better Context for Gift Suggestions

Recipient profiles can store rich information that improves suggestion relevance:

NameRelationshipBirthday or age rangeGenderOccupationLikesDislikesHobbiesAdditional information

Recipient data provides the context needed to organize ideas and generate more relevant suggestions. Validation prevents incomplete or contradictory age information, while birthday-based age calculation helps keep profiles current. A default general gift list is created when a recipient is added.

Gift planning

Tracking Ideas Through the Giving Process

Connected data

  • Recipients
  • Events
  • Gift lists
  • Gifts
  • Product offers
  • Individual event-recipient budgets

Gift statuses

  1. Idea
  2. Planned
  3. Ordered
  4. Acquired
  5. Wrapped
  6. Given

This status system turns GiftWise into more than a suggestion generator by helping users manage the complete gift-planning process.

AI integration

Suggestions Based on Recipient Context

GiftWise sends recipient context to the OpenAI API. The service requests structured JSON gift suggestions. Existing gift names can be included to discourage duplicate recommendations. Suggestions are cached for seven days. Users can force a refresh when they want new results. The service handles missing API keys and malformed responses. Basic filtering checks free-form fields for common prompt-manipulation phrases.

The AI integration demonstrated how an application can transform structured user data into a useful model request, validate the returned format, cache results, and handle external-service failures without making the API the only useful part of the product.

The basic filtering is a defensive check, not a guarantee against prompt manipulation. AI suggestions may still require user judgment.

External data

Connecting Ideas to Real Product Options

  • Searches Google Shopping through SerpAPI
  • Retrieves stores, prices, ratings, and product URLs
  • Removes incomplete offers
  • Keeps the lowest-priced result from each store
  • Sorts offers by price
  • Limits the displayed results
  • Uses a static fallback catalog when appropriate
  • Uses deterministic fallback data during tests

The GiftOfferLookupService connects gift ideas to real product options through Google Shopping:

GiftWise does not sell products or process purchases.

What I learned

Learning Ruby Through the Rails Ecosystem

Ruby

Learned Ruby syntax, object-oriented organization, modules, validation methods, enumerations, collections, and service classes.

MVC Architecture

Worked with Rails models, views, and controllers to separate data rules, interface rendering, and request handling.

Active Record

Used model relationships, validations, callbacks, scopes, enums, migrations, and database-backed queries.

Rails Conventions

Learned how resourceful routing, naming conventions, migrations, helpers, partials, and framework structure support a larger application.

External Services

Worked in a codebase that integrated OpenAI, Google OAuth, and product-search APIs through environment-based configuration.

Team Development

Practiced Git branching, pull requests, merge-conflict resolution, linting, testing, and incremental feature development in a shared repository.

SaaS concepts

Designing a Multi-Feature Web Service

GiftWise demonstrates SaaS-style concepts through comprehensive application design:

  • User accounts
  • User-owned persistent data
  • Personalized application experiences
  • Connected domain models
  • Authentication
  • Third-party API integrations
  • Cached service results
  • Form validation
  • Automated testing
  • Environment-based configuration
  • Separate development, testing, and production database configurations
  • Container and deployment configuration included in the repository

This is a SaaS-style course project; the repository does not confirm a currently operated public service.

Testing

Validating Features at Multiple Levels

  • RSpec model tests
  • RSpec controller tests
  • Request tests
  • View tests
  • Service tests
  • Cucumber feature scenarios
  • Capybara
  • SimpleCov coverage reporting
  • RuboCop linting
  • Brakeman security analysis
  • Bundler Audit

Feature scenarios cover areas such as authentication, recipients, events, gifts, offers, and gift-status updates.

Reflection

Working in a Large Collaborative Rails Codebase

Learning a New Framework

Ruby on Rails introduced a new language, framework conventions, directory structure, routing system, and database abstraction that I had to learn while actively contributing features.

Coordinating Connected Models

Recipients, events, budgets, gift lists, gifts, and users depend on one another. Changes required careful attention to associations, validations, migrations, and referential integrity.

Collaborative Development

Multiple developers contributed simultaneously, making clear branches, tests, linting, pull-request feedback, and merge-conflict resolution important parts of the development process.

GiftWise taught me how Rails conventions can support rapid development without removing the need for thoughtful data modeling, validation, testing, and teamwork. It also gave me experience contributing meaningful features to an existing team application rather than building only isolated assignments.

Technology stack

Tools Behind GiftWise

Ruby 3.3.8

The programming language used throughout the Rails application.

Ruby on Rails 8.1.1

The web framework coordinating MVC architecture, routing, and database operations.

Active Record

Rails' ORM for database access, migrations, validations, and model relationships.

SQLite

The database for development and test environments.

PostgreSQL

The database for production deployments.

Hotwire

Rails' frontend approach for responsive page updates without a large client framework.

Stimulus

JavaScript controllers for focused interactions such as gift-status updates.

Tailwind CSS

Utility-first CSS framework for responsive design.

OpenAI API

External service for generating personalized gift suggestions.

Google OAuth

Authentication provider for single sign-on functionality.

SerpAPI

External service for searching Google Shopping product data.

RSpec

Testing framework for model, controller, request, and view tests.

Cucumber

Behavior-driven development framework for feature scenarios.

Capybara

Testing library for simulating user interactions with the application.

Git and GitHub

Version control, branching, pull requests, review, and team collaboration.

Skills

Skills Demonstrated

  • Ruby
  • Ruby on Rails
  • MVC architecture
  • SaaS-style application development
  • Active Record
  • Database migrations
  • Model associations
  • Data validation
  • Authentication
  • OAuth integration
  • API integration
  • AI-assisted features
  • Recipient management
  • Budget tracking
  • Automated testing
  • Behavior-driven development
  • Debugging
  • Git workflows
  • Pull-request collaboration
  • Team software development

Explore GiftWise

See the collaborative Rails project