Skip to content

Commit d3b9016

Browse files
authored
Merge pull request #3 from VishalMCF/feature/ride-sharing
finished machine coding a ride amount calculdator app
2 parents b47dfd4 + 2a232ce commit d3b9016

17 files changed

+515
-0
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.gatomalvado.ridesharing;
2+
3+
public class ConstantConfig {
4+
public static double amountCharged = 20.0;
5+
6+
public static final String MSG_CODE1 = "Ride could not be found for the id provided => ";
7+
public static final String MSG_CODE2 = "Seats can only be between 1 to 4";
8+
public static final String MSG_CODE3 = "Destination must be greater than origin";
9+
public static final String MSG_CODE4 = "Destination and origin must be greater than 0";
10+
public static final String MSG_CODE5 = "Cannot withdraw a ride which is not in a booked status, id -> ";
11+
public static final String MSG_CODE6 = "";
12+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.gatomalvado.ridesharing;
2+
3+
import java.sql.DriverManager;
4+
5+
import com.gatomalvado.ridesharing.model.BookedRide;
6+
import com.gatomalvado.ridesharing.model.Driver;
7+
import com.gatomalvado.ridesharing.model.Rider;
8+
import com.gatomalvado.ridesharing.model.enums.UserType;
9+
import com.gatomalvado.ridesharing.orchestrator.RideManager;
10+
import com.gatomalvado.ridesharing.strategy.CostCalculatorFactory;
11+
12+
public class Main {
13+
public static void main(String[] args){
14+
Rider rider1 = new Rider("r1","rider1", "email1");
15+
Rider rider2 = new Rider("r2","rider2", "email2");
16+
17+
Driver driver1 = new Driver("d1","driver1", "email3");
18+
Driver driver2 = new Driver("d2","driver2", "email4");
19+
Driver driver3 = new Driver("d3","driver3", "email5");
20+
Driver driver4 = new Driver("d4","driver4", "email6");
21+
22+
CostCalculatorFactory costCalculatorFactory = new CostCalculatorFactory();
23+
RideManager riderManager = new RideManager(costCalculatorFactory);
24+
25+
riderManager.addRider(rider1);
26+
riderManager.addRider(rider2);
27+
28+
riderManager.addDriver(driver1);
29+
riderManager.addDriver(driver2);
30+
riderManager.addDriver(driver3);
31+
riderManager.addDriver(driver4);
32+
33+
// take input
34+
35+
// create ride
36+
}
37+
38+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# Ride Sharing Application Design
2+
3+
## Problem Definition
4+
Design a Ride sharing application where drivers can offer rides (origin, destination, no of seats), and any rider can request rides (origin, destination, no of seats). The application should calculate the ride amount charged for a given ride based on distance and the number of seats. The algorithm for calculating ride amount is as follows:
5+
1. When the ride closes, show the amount charged to the rider.
6+
2. Ride amount if No of seats >= 2: No of kilometers * No of seats * 0.75 * Amount Charged per KM
7+
3. Ride amount if No of seats = 1: No of kilometers * Amount Charged per KM
8+
9+
## Assumptions
10+
1. Amount charged per KM = 20
11+
2. No of Kilometers = destination - origin
12+
3. All values are integers
13+
14+
## Test Cases
15+
- A requesting for ride R1
16+
- **INPUT:** A requests 50, 60, 1
17+
- **OUTPUT:** Ride Amount: 10 * 20 (Amount/Km) = 200
18+
19+
- A requesting for ride R1
20+
- **INPUT:** A requests 50, 60, 2
21+
- **OUTPUT:** Ride Amount: 10 * 2 * 0.75 * 20 (Amount/Km) = 300
22+
23+
## Bonus
24+
- Upgrade the rider to a preferred rider if he has done more than 10 rides.
25+
- Preferred Rider amount if No of seats >= 2: No of kilometers * No of seats * 0.5 * Amount Charged per KM
26+
- Preferred Ride amount if No of seats = 1: No of kilometers * Amount Charged per KM * 0.75
27+
28+
## Functionalities Expected
29+
- Add Driver(name)
30+
- Add Rider(name)
31+
- Create Ride (id, origin, destination, no of seats)
32+
- Create/Update Ride (id, origin, destination, no of seats)
33+
- Withdraw Ride (id)
34+
- Close ride and return ride amount charged
35+
36+
## Expectations
37+
1. Create the sample data yourself. You can put it into a file, test case, or main driver program itself.
38+
2. The code should be demo-able. Either by using the main driver program or test cases.
39+
3. The code should be modular with basic OO design.
40+
4. The code should be extensible with interfaces and contracts between different methods.
41+
5. The code should handle edge cases properly and fail gracefully.
42+
6. The code should be legible, readable, and DRY.
43+
7. Database integration is not required.
44+
45+
## Guidelines
46+
1. Do not access the internet for anything EXCEPT syntax.
47+
2. You are free to use the language and IDE of your choice.
48+
3. The entire code should be your own.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.gatomalvado.ridesharing.exception;
2+
3+
public class InvalidInputException extends RuntimeException {
4+
5+
public InvalidInputException(String message) {
6+
super(message);
7+
}
8+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.gatomalvado.ridesharing.model;
2+
3+
import java.util.UUID;
4+
5+
import com.gatomalvado.ridesharing.model.enums.RideStatus;
6+
7+
import lombok.AllArgsConstructor;
8+
import lombok.Data;
9+
import lombok.NoArgsConstructor;
10+
11+
@Data
12+
@AllArgsConstructor
13+
@NoArgsConstructor
14+
public class BookedRide {
15+
16+
private Rider rider;
17+
private Driver driver;
18+
private Ride rideDetails;
19+
private String id;
20+
private RideStatus rideStatus;
21+
22+
public BookedRide(Rider rider, Driver driver, Ride rideDetails, RideStatus rideStatus) {
23+
this.rider = rider;
24+
this.driver = driver;
25+
this.rideDetails = rideDetails;
26+
this.id = UUID.randomUUID().toString();
27+
this.rideStatus = rideStatus;
28+
}
29+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.gatomalvado.ridesharing.model;
2+
3+
import com.gatomalvado.ridesharing.model.enums.UserType;
4+
5+
import lombok.AllArgsConstructor;
6+
import lombok.Data;
7+
import lombok.EqualsAndHashCode;
8+
import lombok.NoArgsConstructor;
9+
10+
@Data
11+
@AllArgsConstructor
12+
@EqualsAndHashCode(callSuper = true)
13+
public class Driver extends UserDetails{
14+
private UserType userType;
15+
private Boolean isFree;
16+
17+
public Driver(String userId, String name, String email) {
18+
super(userId, name, email);
19+
this.userType = UserType.DRIVER;
20+
this.isFree = true;
21+
}
22+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.gatomalvado.ridesharing.model;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Data;
5+
import lombok.NoArgsConstructor;
6+
7+
@Data
8+
@NoArgsConstructor
9+
@AllArgsConstructor
10+
public class Ride {
11+
private Double origin;
12+
private Double destination;
13+
private Integer noOfSeats;
14+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.gatomalvado.ridesharing.model;
2+
3+
import com.gatomalvado.ridesharing.model.enums.UserType;
4+
5+
import lombok.AllArgsConstructor;
6+
import lombok.Data;
7+
import lombok.EqualsAndHashCode;
8+
import lombok.NoArgsConstructor;
9+
10+
@EqualsAndHashCode(callSuper = true)
11+
@AllArgsConstructor
12+
@Data
13+
public class Rider extends UserDetails {
14+
private UserType userType;
15+
private boolean preferredRider;
16+
17+
public Rider(String userId, String name, String email) {
18+
super(userId, name, email);
19+
this.userType = UserType.RIDER;
20+
}
21+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.gatomalvado.ridesharing.model;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Data;
5+
import lombok.NoArgsConstructor;
6+
7+
@Data
8+
@NoArgsConstructor
9+
@AllArgsConstructor
10+
public class UserDetails {
11+
private String userId;
12+
private String name;
13+
private String email;
14+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.gatomalvado.ridesharing.model.enums;
2+
3+
import lombok.Getter;
4+
5+
@Getter
6+
public enum RideStatus {
7+
BOOKED("booked"),
8+
WITHDRAWN("withdrawn"),
9+
CLOSED("closed");
10+
11+
private String name;
12+
13+
RideStatus(String name) {
14+
this.name = name;
15+
}
16+
}

0 commit comments

Comments
 (0)