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.
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:
- 1Create an account
- 2Add a recipient
- 3Record interests and personal details
- 4Create or select an event
- 5Set a budget
- 6Generate or add gift ideas
- 7Compare product offers
- 8Track the gift's status
- 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:
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
- Idea
- Planned
- Ordered
- Acquired
- Wrapped
- 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