A REST API for discovering and managing technology meetup groups
The Meetup Groups REST API is a Spring Boot application designed to help discover and manage technology meetup groups. This API provides endpoints to browse technology meetup groups organized by city and technology focus, making it easy to find and connect with local tech communities.
- Java 25 - Programming language
- Spring Boot 4.0.1 - Application framework
- Gradle 9.2.1 - Build tool
- Spring Web MVC - REST API framework
- In-memory data storage - Fast, simple data persistence
springboot-restapi/
├── src/
│ ├── main/
│ │ ├── java/com/legion/meetup/
│ │ │ ├── MeetupApplication.java
│ │ │ ├── HomeController.java
│ │ │ └── group/
│ │ │ ├── GroupController.java
│ │ │ └── Group.java
│ │ └── resources/
│ │ └── application.yaml
│ └── test/
│ └── java/com/legion/meetup/
└── build.gradle
- Java 25 or higher
- Gradle 9.2.1 (or use the included wrapper)
-
Clone the repository:
git clone <repository-url>
-
Navigate to the project directory:
cd springboot-restapi -
Build the project:
./gradlew build
-
Run the application:
./gradlew bootRun
-
Access the API:
http://localhost:8080
- GET / - Returns a welcome message
- Response:
"Hello, World!" - Status Code: 200 OK
- Response:
-
GET /api/groups/ - Retrieve all meetup groups
- Returns: Array of Group objects
- Status Code: 200 OK
-
GET /api/groups/{id} - Retrieve a specific group by ID
- Path Parameter:
id(Long) - The unique identifier of the group - Returns: Single Group object (wrapped in Optional)
- Status Code: 200 OK
- Path Parameter:
The Group entity represents a technology meetup group with the following structure:
{
"id": Long,
"name": String,
"description": String,
"city": String,
"organizer": String,
"createdDate": String (ISO-8601 format: "YYYY-MM-DD")
}GET /api/groups/1
{
"id": 1,
"name": "New York Java User Group",
"description": "A community of Java developers in the Cleveland area sharing knowledge and best practices",
"city": "New York",
"organizer": "Mike Chen",
"createdDate": "2010-03-15"
}GET /api/groups/
[
{
"id": 1,
"name": "New York Java User Group",
"description": "A community of Java developers in the Cleveland area sharing knowledge and best practices",
"city": "New York",
"organizer": "Mike Chen",
"createdDate": "2010-03-15"
},
{
"id": 2,
"name": "Cleveland React Meetup",
"description": "Monthly meetup for React and JavaScript developers in Northeast Ohio",
"city": "Cleveland",
"organizer": "Sarah Johnson",
"createdDate": "2017-06-01"
}
]Get all meetup groups:
curl http://localhost:8080/api/groups/Get a specific group by ID:
curl http://localhost:8080/api/groups/1Get the home message:
curl http://localhost:8080/Simply navigate to:
- http://localhost:8080/ - Home page
- http://localhost:8080/api/groups/ - All groups
- http://localhost:8080/api/groups/1 - Specific group
The application comes pre-populated with 4 technology meetup groups:
- New York Java User Group - A community of Java developers in the Cleveland area sharing knowledge and best practices (New York)
- Cleveland React Meetup - Monthly meetup for React and JavaScript developers in Northeast Ohio (Cleveland)
- Los Angeles Python User Group - Python enthusiasts meeting to discuss Python programming, data science, and automation (Los Angeles)
- Chicago Tech Slack - General technology community connecting developers, designers, and tech professionals in Chicago (Chicago)
- In-memory storage: Uses in-memory
ArrayListfor fast access and simple deployment without external database dependencies - Java records: Leverages Java records for immutable, concise data model definitions
- RESTful design: Follows REST principles with resource-based URLs and appropriate HTTP methods
- Spring MVC: Built on Spring's robust MVC framework for handling HTTP requests and responses
- Atomic ID generation: Uses
AtomicLongfor thread-safe ID counter management
Future enhancements planned for this project:
- Full CRUD operations for group management (POST, PUT, DELETE endpoints)
- Member management features (add/remove members, member profiles)
- Event management (create events, RSVP functionality, event details)
- Enhanced search and filtering capabilities (search by city, technology, date range)
- Persistent database integration (PostgreSQL or MySQL)
- Authentication and authorization
- Pagination and sorting for large datasets
- API documentation with Swagger/OpenAPI
Execute the test suite:
./gradlew testBuild the project and create a JAR file:
./gradlew buildThe built JAR will be located in build/libs/.
After building, you can run the JAR directly:
java -jar build/libs/meetup-0.0.1-SNAPSHOT.jar- Package:
com.legion.meetup - Controllers: Handle HTTP requests and route them to appropriate business logic
HomeController- Handles the root endpointGroupController- Manages group-related endpoints
- Models: Java records for immutable data representation
Group- Represents a meetup group
- Configuration: YAML-based Spring configuration in
application.yaml
- MeetupApplication.java (
src/main/java/com/legion/meetup/MeetupApplication.java:10) - Main entry point with@SpringBootApplication - GroupController.java (
src/main/java/com/legion/meetup/group/GroupController.java:16) - REST controller for group operations - Group.java (
src/main/java/com/legion/meetup/group/Group.java:6) - Immutable record representing a group entity
MIT License
Copyright (c) 2026 Legion
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Found a bug or have a feature request? Please use GitHub Issues:
- Search existing issues to see if your issue has already been reported
- If not, create a new issue with a descriptive title and detailed description
- For bugs, include steps to reproduce, expected behavior, and actual behavior
- For feature requests, explain the use case and desired functionality
For questions about usage or development, feel free to open a discussion in GitHub Issues.
Built with Spring Boot and Java 25