Skip to content

Commit d0a5a04

Browse files
committed
[NO_REF] Various changes
1 parent a185aae commit d0a5a04

File tree

8 files changed

+135
-20
lines changed

8 files changed

+135
-20
lines changed
Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,32 @@
11
package com.getourguide.interview.controller;
22

3-
import com.getourguide.interview.dto.Activity;
4-
import jakarta.persistence.EntityManager;
5-
import jakarta.persistence.PersistenceContext;
3+
import com.getourguide.interview.dto.ActivityDto;
4+
import com.getourguide.interview.service.ActivityService;
65
import java.util.List;
6+
import lombok.AllArgsConstructor;
77
import org.springframework.http.ResponseEntity;
88
import org.springframework.stereotype.Controller;
99
import org.springframework.web.bind.annotation.GetMapping;
10+
import org.springframework.web.bind.annotation.PathVariable;
1011

1112
@Controller
13+
@AllArgsConstructor
1214
public class ActivitiesController {
1315

14-
@PersistenceContext
15-
private EntityManager entityManager;
16+
private final ActivityService activityService;
1617

1718
@GetMapping("/activities")
18-
public ResponseEntity<String> activities() {
19-
List<Activity> resultList = (List<Activity>) entityManager.createNativeQuery("SELECT * FROM GETYOURGUIDE.ACTIVITY", Activity.class).getResultList();
20-
return ResponseEntity.ok(resultList.toString());
19+
public ResponseEntity<List<ActivityDto>> activities() {
20+
return ResponseEntity.ok(activityService.getActivities());
2121
}
2222

23+
@GetMapping("/activities/{id}")
24+
public ResponseEntity<ActivityDto> activities(@PathVariable Long id) {
25+
return ResponseEntity.ok(activityService.getActivities(id));
26+
}
27+
28+
@GetMapping("/activities/search/{search}")
29+
public ResponseEntity<List<ActivityDto>> activitiesSearch(@PathVariable String search) {
30+
return ResponseEntity.ok(activityService.searchActivities(search));
31+
}
2332
}

src/main/java/com/getourguide/interview/controller/SupplierController.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.getourguide.interview.controller;
22

3-
import com.getourguide.interview.dto.Supplier;
3+
import com.getourguide.interview.entity.Supplier;
44
import jakarta.persistence.EntityManager;
55
import jakarta.persistence.PersistenceContext;
66
import java.util.List;
@@ -25,10 +25,7 @@ public ResponseEntity<List<Supplier>> suppliers() {
2525
public ResponseEntity<List<Supplier>> suppliersSearch(@PathVariable String search) {
2626
var list = (List<Supplier>) entityManager.createNativeQuery("SELECT * FROM GETYOURGUIDE.SUPPLIER", Supplier.class).getResultList();
2727
for(Supplier s: list) {
28-
String sb =
29-
new StringBuilder().append(s.getName()).append(s.getAddress()).append(s.getZip()).append(s.getCity())
30-
.append(s.getCountry()).toString();
31-
if(sb.contains(search)) {
28+
if(new StringBuilder().append(s.getName()).append(s.getAddress()).append(s.getZip()).append(s.getCity()).append(s.getCountry()).toString().contains(search)) {
3229
return ResponseEntity.ok(List.of(s));
3330
}
3431
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.getourguide.interview.dto;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Data;
6+
import lombok.NoArgsConstructor;
7+
8+
@Data
9+
@Builder
10+
public class ActivityDto {
11+
private Long id;
12+
private String title;
13+
private int price;
14+
private String currency;
15+
private double rating;
16+
private boolean specialOffer;
17+
private String supplierName;
18+
}

src/main/java/com/getourguide/interview/dto/Activity.java renamed to src/main/java/com/getourguide/interview/entity/Activity.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
1-
package com.getourguide.interview.dto;
1+
package com.getourguide.interview.entity;
22

33
import jakarta.persistence.Entity;
4+
import jakarta.persistence.FetchType;
45
import jakarta.persistence.GeneratedValue;
56
import jakarta.persistence.GenerationType;
67
import jakarta.persistence.Id;
8+
import jakarta.persistence.ManyToOne;
79
import jakarta.persistence.Table;
810
import lombok.Data;
911
import lombok.NoArgsConstructor;
12+
import org.hibernate.annotations.NotFound;
13+
import org.hibernate.annotations.NotFoundAction;
1014

1115
@Data
1216
@Entity
13-
@Table(name = "getyourguide.activity")
17+
@Table(schema = "getyourguide", name = "activity")
1418
@NoArgsConstructor
1519
public class Activity {
1620
@Id
@@ -21,4 +25,7 @@ public class Activity {
2125
private String currency;
2226
private double rating;
2327
private boolean specialOffer;
28+
@ManyToOne(fetch = FetchType.LAZY)
29+
@NotFound(action = NotFoundAction.IGNORE)
30+
private Supplier supplier;
2431
}
Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
1-
package com.getourguide.interview.dto;
1+
package com.getourguide.interview.entity;
22

33
import jakarta.persistence.Entity;
44
import jakarta.persistence.Id;
5+
import jakarta.persistence.OneToMany;
56
import jakarta.persistence.Table;
7+
import java.util.List;
68
import lombok.Data;
79
import lombok.NoArgsConstructor;
810

911
@Data
1012
@Entity
11-
@Table(name = "getyourguide.supplier")
13+
@Table(schema="getyourguide", name = "supplier")
1214
@NoArgsConstructor
1315
public class Supplier {
1416
@Id
@@ -18,4 +20,6 @@ public class Supplier {
1820
private String zip;
1921
private String city;
2022
private String country;
23+
@OneToMany(mappedBy = "supplier")
24+
private List<Activity> activities;
2125
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.getourguide.interview.repository;
2+
3+
import com.getourguide.interview.entity.Activity;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
import org.springframework.stereotype.Repository;
6+
7+
@Repository
8+
public interface ActivityRepository extends JpaRepository<Activity, Long> {
9+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package com.getourguide.interview.service;
2+
3+
import com.getourguide.interview.controller.SupplierController;
4+
import com.getourguide.interview.dto.ActivityDto;
5+
import com.getourguide.interview.entity.Activity;
6+
import com.getourguide.interview.repository.ActivityRepository;
7+
import java.util.ArrayList;
8+
import java.util.List;
9+
import java.util.Objects;
10+
import lombok.AllArgsConstructor;
11+
import org.springframework.stereotype.Service;
12+
13+
@Service
14+
@AllArgsConstructor
15+
public class ActivityService {
16+
private final ActivityRepository activityRepository;
17+
private final SupplierController supplierController;
18+
public List<ActivityDto> getActivities() {
19+
List<Activity> activities = activityRepository.findAll();
20+
List<ActivityDto> result = new ArrayList<>();
21+
activities.stream().forEach(activity -> {
22+
result.add(ActivityDto.builder()
23+
.id(activity.getId())
24+
.title(activity.getTitle())
25+
.price(activity.getPrice())
26+
.currency(activity.getCurrency())
27+
.rating(activity.getRating())
28+
.specialOffer(activity.isSpecialOffer())
29+
.supplierName(Objects.isNull(activity.getSupplier()) ? "" : activity.getSupplier().getName())
30+
.build());
31+
});
32+
return result;
33+
}
34+
35+
public ActivityDto getActivities(Long activityId) {
36+
List<Activity> activities = activityRepository.findAll();
37+
List<ActivityDto> result = new ArrayList<>();
38+
activities.stream().filter(activity -> activityId.equals(activity.getId())).forEach(activity -> {
39+
result.add(ActivityDto.builder()
40+
.id(activity.getId())
41+
.title(activity.getTitle())
42+
.price(activity.getPrice())
43+
.currency(activity.getCurrency())
44+
.rating(activity.getRating())
45+
.specialOffer(activity.isSpecialOffer())
46+
.supplierName(activity.getSupplier().getName())
47+
.build());
48+
});
49+
return result.get(0);
50+
}
51+
52+
public List<ActivityDto> searchActivities(String search) {
53+
List<Activity> activities = activityRepository.findAll();
54+
List<ActivityDto> result = new ArrayList<>();
55+
activities.stream().filter(a -> a.getTitle().contains(search)).forEach(activity -> {
56+
result.add(ActivityDto.builder()
57+
.id(activity.getId())
58+
.title(activity.getTitle())
59+
.price(activity.getPrice())
60+
.currency(activity.getCurrency())
61+
.rating(activity.getRating())
62+
.specialOffer(activity.isSpecialOffer())
63+
.supplierName(activity.getSupplier().getName())
64+
.build());
65+
});
66+
return result;
67+
}
68+
}

src/main/resources/db/migration/V1.0.1__create_activities_table.sql

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ CREATE TABLE IF NOT EXISTS getyourguide.activity (
77
currency VARCHAR(16),
88
rating FLOAT,
99
special_offer BOOLEAN,
10-
supplierId LONG
10+
supplier_id LONG
1111
);
1212

13-
INSERT INTO getyourguide.activity (id, title, price, currency, rating, special_offer, supplierId) VALUES
13+
INSERT INTO getyourguide.activity (id, title, price, currency, rating, special_offer, supplier_id) VALUES
1414
(25651, 'German Tour: Parliament Quarter & Reichstag glass dome', 14, '$', 4.8, FALSE, 1),
1515
(6960, 'Skip the Line: Pergamon Museum Berlin Tickets', 21, '$', 4.8, FALSE, 2),
1616
(80426, 'Berlin WelcomeCard: Transport, Discounts & Guide Book', 10, '$', 4.6, FALSE, 2),
@@ -19,9 +19,12 @@ INSERT INTO getyourguide.activity (id, title, price, currency, rating, special_o
1919
(97470, 'Berlin Hop-on Hop-off Bus Tour: 1- or 2-Day Ticket', 210, '$', 4.3, FALSE, 200),
2020
(15647, 'German Tour: Reichstag with Plenary Chamber & Cuppola', 59, '$', 4.8, FALSE, 250),
2121
(26823, 'Berlin: 2.5-Hour Boat Tour Along the River Spree', 41, '$', 4.5, TRUE, 1),
22+
(26824, 'Berlin: 2.5-Hour Boat Tour Along the River Spree', 45, '$', 4.7, TRUE, 1),
23+
(26825, 'Berlin: 2.5-Hour Boat Tour Along the River Spree', 49, '$', 4.7, TRUE, 1),
2224
(58351, 'Museum Pass Berlin: 3-Day Entry to Over 40 Top Museums', 14, '$', 4.5, FALSE, 250),
2325
(75009, 'Reichstag: Rooftop Coffee Break at Käfer', 50, '$', 4.6, TRUE, 2),
2426
(19340, 'Skip the Line: Neues Museum Berlin Tickets', 46, '$', 4.9, TRUE, 250),
2527
(13399, 'German Tour: Reichstag with dome Chamber &', 87, '$', 4.8, FALSE, 200),
2628
(86150, 'Berlin Hop-on Hop-off Bus Tour with Live Commentary', 8, '$', 4.3, FALSE, 1),
27-
(40881, 'Skip the Line: TV Tower Early Bird Tickets', 140, '$', 4.5, FALSE, 2);
29+
(40881, 'Skip the Line: TV Tower Early Bird Tickets', 140, '$', 4.5, FALSE, 2),
30+
(40882, 'City Pass: 3 Days Ticket', 149, '$', 4.2, FALSE, 5);

0 commit comments

Comments
 (0)