Skip to content

Commit a9d8c6c

Browse files
authored
Merge pull request #19 from mongodb/java-backend-fixes
fix(java): get batch and search working properly with frontend
2 parents bffca50 + 452b5fd commit a9d8c6c

13 files changed

Lines changed: 496 additions & 338 deletions

File tree

client/app/lib/api.ts

Lines changed: 45 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -115,16 +115,16 @@ export async function updateMovie(id: string, updateData: Partial<Movie>): Promi
115115
const result = await response.json();
116116

117117
if (!response.ok) {
118-
return {
119-
success: false,
120-
error: result.error || `Failed to update movie: ${response.status}`
118+
return {
119+
success: false,
120+
error: result.message || result.error?.message || `Failed to update movie: ${response.status}`
121121
};
122122
}
123123

124124
if (!result.success) {
125-
return {
126-
success: false,
127-
error: result.error || 'API returned error response'
125+
return {
126+
success: false,
127+
error: result.message || result.error?.message || 'API returned error response'
128128
};
129129
}
130130

@@ -155,16 +155,16 @@ export async function deleteMovie(id: string): Promise<{ success: boolean; error
155155
const result = await response.json();
156156

157157
if (!response.ok) {
158-
return {
159-
success: false,
160-
error: result.error || `Failed to delete movie: ${response.status}`
158+
return {
159+
success: false,
160+
error: result.message || result.error?.message || `Failed to delete movie: ${response.status}`
161161
};
162162
}
163163

164164
if (!result.success) {
165-
return {
166-
success: false,
167-
error: result.error || 'API returned error response'
165+
return {
166+
success: false,
167+
error: result.message || result.error?.message || 'API returned error response'
168168
};
169169
}
170170

@@ -194,16 +194,16 @@ export async function createMovie(movieData: Omit<Movie, '_id'>): Promise<{ succ
194194
const result = await response.json();
195195

196196
if (!response.ok) {
197-
return {
198-
success: false,
199-
error: result.error || `Failed to create movie: ${response.status}`
197+
return {
198+
success: false,
199+
error: result.message || result.error?.message || `Failed to create movie: ${response.status}`
200200
};
201201
}
202202

203203
if (!result.success) {
204-
return {
205-
success: false,
206-
error: result.error || 'API returned error response'
204+
return {
205+
success: false,
206+
error: result.message || result.error?.message || 'API returned error response'
207207
};
208208
}
209209

@@ -236,16 +236,16 @@ export async function createMoviesBatch(moviesData: Omit<Movie, '_id'>[]): Promi
236236
const result = await response.json();
237237

238238
if (!response.ok) {
239-
return {
240-
success: false,
241-
error: result.error || `Failed to create movies: ${response.status}`
239+
return {
240+
success: false,
241+
error: result.message || result.error?.message || `Failed to create movies: ${response.status}`
242242
};
243243
}
244244

245245
if (!result.success) {
246-
return {
247-
success: false,
248-
error: result.error || 'API returned error response'
246+
return {
247+
success: false,
248+
error: result.message || result.error?.message || 'API returned error response'
249249
};
250250
}
251251

@@ -287,16 +287,16 @@ export async function deleteMoviesBatch(movieIds: string[]): Promise<{ success:
287287
const result = await response.json();
288288

289289
if (!response.ok) {
290-
return {
291-
success: false,
292-
error: result.error || `Failed to delete movies: ${response.status}`
290+
return {
291+
success: false,
292+
error: result.message || result.error?.message || `Failed to delete movies: ${response.status}`
293293
};
294294
}
295295

296296
if (!result.success) {
297-
return {
298-
success: false,
299-
error: result.error || 'API returned error response'
297+
return {
298+
success: false,
299+
error: result.message || result.error?.message || 'API returned error response'
300300
};
301301
}
302302

@@ -337,16 +337,16 @@ export async function updateMoviesBatch(movieIds: string[], updateData: Partial<
337337
const result = await response.json();
338338

339339
if (!response.ok) {
340-
return {
341-
success: false,
342-
error: result.error || `Failed to update movies: ${response.status}`
340+
return {
341+
success: false,
342+
error: result.message || result.error?.message || `Failed to update movies: ${response.status}`
343343
};
344344
}
345345

346346
if (!result.success) {
347-
return {
348-
success: false,
349-
error: result.error || 'API returned error response'
347+
return {
348+
success: false,
349+
error: result.message || result.error?.message || 'API returned error response'
350350
};
351351
}
352352

@@ -403,16 +403,16 @@ export async function searchMovies(searchParams: {
403403
const result = await response.json();
404404

405405
if (!response.ok) {
406-
return {
407-
success: false,
408-
error: result.error || `Failed to search movies: ${response.status}`
406+
return {
407+
success: false,
408+
error: result.message || result.error?.message || `Failed to search movies: ${response.status}`
409409
};
410410
}
411411

412412
if (!result.success) {
413-
return {
414-
success: false,
415-
error: result.error || 'API returned error response'
413+
return {
414+
success: false,
415+
error: result.message || result.error?.message || 'API returned error response'
416416
};
417417
}
418418

@@ -422,8 +422,8 @@ export async function searchMovies(searchParams: {
422422
const hasNextPage = skip + limit < totalCount;
423423
const hasPrevPage = skip > 0;
424424

425-
return {
426-
success: true,
425+
return {
426+
success: true,
427427
movies,
428428
hasNextPage,
429429
hasPrevPage,
@@ -436,4 +436,4 @@ export async function searchMovies(searchParams: {
436436
error: 'Network error occurred while searching movies'
437437
};
438438
}
439-
}
439+
}

client/tsconfig.json

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
{
22
"compilerOptions": {
33
"target": "ES2017",
4-
"lib": ["dom", "dom.iterable", "esnext"],
4+
"lib": [
5+
"dom",
6+
"dom.iterable",
7+
"esnext"
8+
],
59
"allowJs": true,
610
"skipLibCheck": true,
711
"strict": true,
@@ -11,18 +15,30 @@
1115
"moduleResolution": "bundler",
1216
"resolveJsonModule": true,
1317
"isolatedModules": true,
14-
"jsx": "preserve",
18+
"jsx": "react-jsx",
1519
"incremental": true,
1620
"plugins": [
1721
{
1822
"name": "next"
1923
}
2024
],
2125
"paths": {
22-
"@/*": ["./app/*"],
23-
"@/types/*": ["./app/types/*"]
26+
"@/*": [
27+
"./app/*"
28+
],
29+
"@/types/*": [
30+
"./app/types/*"
31+
]
2432
}
2533
},
26-
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
27-
"exclude": ["node_modules"]
34+
"include": [
35+
"next-env.d.ts",
36+
"**/*.ts",
37+
"**/*.tsx",
38+
".next/types/**/*.ts",
39+
".next/dev/types/**/*.ts"
40+
],
41+
"exclude": [
42+
"node_modules"
43+
]
2844
}

mflix/README-JAVA-SPRING.md

Lines changed: 131 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,142 @@
11
# Java Spring Boot MongoDB Sample MFlix Application
22

3-
[TODO: Add intro]
3+
This is a full-stack movie browsing application built with Java Spring Boot and Next.js, demonstrating MongoDB operations using the `sample_mflix` dataset. The application showcases CRUD operations, aggregations, and MongoDB Search using Spring Data MongoDB.
4+
5+
## Project Structure
46

57
```
6-
├── README.md
7-
├── client/ # Next.js frontend
8-
└── server/ # Java Spring backend
8+
├── README-JAVA-SPRING.md
9+
├── client/ # Next.js frontend (TypeScript)
10+
└── server/java-spring/ # Java Spring Boot backend
11+
├── src/
12+
├── pom.xml
13+
├── .env.example
14+
└── mvnw
915
```
1016

17+
## Prerequisites
18+
19+
- **Java 21** or higher
20+
- **Node.js 20** or higher
21+
- **MongoDB Atlas account** with the `sample_mflix` dataset loaded
22+
- [Load sample data](https://www.mongodb.com/docs/atlas/sample-data/) in your Atlas cluster
23+
- **Maven** (included via Maven Wrapper)
24+
1125
## Getting Started
1226

13-
[TODO: Add getting started instructions explaining how to set connection string, start server, start client, etc.]
27+
### 1. Configure the Backend
28+
29+
Navigate to the Java Spring server directory:
30+
31+
```bash
32+
cd server/java-spring
33+
```
34+
35+
Create a `.env` file from the example:
36+
37+
```bash
38+
cp .env.example .env
39+
```
40+
41+
Edit the `.env` file and set your MongoDB connection string:
42+
43+
```env
44+
# MongoDB Connection
45+
MONGODB_URI=mongodb+srv://username:password@cluster.mongodb.net/?retryWrites=true&w=majority
46+
47+
# Server Configuration
48+
PORT=3001
49+
50+
# CORS Configuration
51+
CORS_ORIGIN=http://localhost:3000
52+
```
53+
54+
**Note:** Replace `username`, `password`, and `cluster` with your actual MongoDB Atlas credentials.
55+
56+
### 2. Start the Backend Server
57+
58+
From the `server/java-spring` directory, run:
59+
60+
```bash
61+
# Using Maven Wrapper (recommended)
62+
./mvnw spring-boot:run
63+
64+
# Or on Windows
65+
mvnw.cmd spring-boot:run
66+
```
67+
68+
The server will start on `http://localhost:3001`. You can verify it's running by visiting:
69+
- API root: http://localhost:3001/
70+
- API documentation (Swagger UI): http://localhost:3001/swagger-ui.html
71+
72+
### 3. Configure and Start the Frontend
73+
74+
Open a new terminal and navigate to the client directory:
75+
76+
```bash
77+
cd client
78+
```
79+
80+
Install dependencies:
81+
82+
```bash
83+
npm install
84+
```
85+
86+
Start the development server:
87+
88+
```bash
89+
npm run dev
90+
```
91+
92+
The Next.js application will start on `http://localhost:3000`.
93+
94+
### 4. Access the Application
95+
96+
Open your browser and navigate to:
97+
- **Frontend:** http://localhost:3000
98+
- **Backend API:** http://localhost:3001
99+
- **API Documentation:** http://localhost:3001/swagger-ui.html
100+
101+
## Features
102+
103+
- **Browse Movies:** View a paginated list of movies from the sample_mflix dataset
104+
- **Search:** Full-text search using MongoDB Search
105+
- **Filter:** Filter movies by genre, year, rating, and more
106+
- **Movie Details:** View detailed information about each movie
107+
- **Aggregations:** Complex data aggregations and analytics
108+
109+
## Development
110+
111+
### Backend Development
112+
113+
The Java Spring Boot backend uses:
114+
- **Spring Data MongoDB** for database operations
115+
- **Spring Boot Web** for REST API
116+
- **SpringDoc OpenAPI** for API documentation
117+
- **Maven** for dependency management
118+
119+
To run tests:
120+
121+
```bash
122+
cd server/java-spring
123+
./mvnw test
124+
```
125+
126+
### Frontend Development
127+
128+
The Next.js frontend uses:
129+
- **React 19** with TypeScript
130+
- **Next.js 16** with App Router
131+
- **Turbopack** for fast development builds
132+
133+
To build for production:
134+
135+
```bash
136+
cd client
137+
npm run build
138+
npm start
139+
```
14140

15141
## Issues
16142

0 commit comments

Comments
 (0)