-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path36.DesignASubscriptionManager.java
More file actions
135 lines (108 loc) · 3.53 KB
/
36.DesignASubscriptionManager.java
File metadata and controls
135 lines (108 loc) · 3.53 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
import java.time.LocalDate;
import java.util.*;
class Subscription {
private int subId;
private int userId;
private String planName;
private LocalDate startDate;
private LocalDate endDate;
private String status; // ACTIVE, CANCELLED
public Subscription(int subId, int userId, String planName, LocalDate startDate, LocalDate endDate) {
this.subId = subId;
this.userId = userId;
this.planName = planName;
this.startDate = startDate;
this.endDate = endDate;
this.status = "ACTIVE";
}
public boolean isActive() {
LocalDate today = LocalDate.now();
return status.equals("ACTIVE") && !today.isAfter(endDate);
}
public void renew(int days) {
this.endDate = this.endDate.plusDays(days);
}
public void cancel() {
this.status = "CANCELLED";
}
public int getUserId() {
return userId;
}
public int getSubId() {
return subId;
}
public String getPlanName() {
return planName;
}
public String getStatus() {
return status;
}
public LocalDate getEndDate() {
return endDate;
}
}
class SubscriptionManager {
private static SubscriptionManager instance;
private Map<Integer, List<Subscription>> subscriptions;
private SubscriptionManager() {
subscriptions = new HashMap<>();
}
public static SubscriptionManager getInstance() {
if (instance == null) {
instance = new SubscriptionManager();
}
return instance;
}
public void addSubscription(Subscription s) {
subscriptions.computeIfAbsent(s.getUserId(), k -> new ArrayList<>()).add(s);
}
public void cancelSubscription(int userId, int subId) {
List<Subscription> list = subscriptions.getOrDefault(userId, Collections.emptyList());
for (Subscription s : list) {
if (s.getSubId() == subId) {
s.cancel();
}
}
}
public void renewSubscription(int userId, int subId, int days) {
List<Subscription> list = subscriptions.getOrDefault(userId, Collections.emptyList());
for (Subscription s : list) {
if (s.getSubId() == subId) {
s.renew(days);
}
}
}
public List<Subscription> getActive(int userId) {
List<Subscription> res = new ArrayList<>();
List<Subscription> list = subscriptions.getOrDefault(userId, Collections.emptyList());
for (Subscription s : list) {
if (s.isActive()) res.add(s);
}
return res;
}
}
public class SubscriptionDemo {
public static void main(String[] args) {
SubscriptionManager manager = SubscriptionManager.getInstance();
Subscription s1 = new Subscription(
1,
101,
"Premium",
LocalDate.now(),
LocalDate.now().plusDays(7)
);
manager.addSubscription(s1);
System.out.println("Active subs before cancel: ");
for (Subscription s : manager.getActive(101)) {
System.out.println(s.getPlanName());
}
manager.cancelSubscription(101, 1);
System.out.println("Active subs after cancel: ");
for (Subscription s : manager.getActive(101)) {
System.out.println(s.getPlanName());
}
manager.renewSubscription(101, 1, 10);
System.out.println("Renew attempted → Status: " + s1.getStatus() +
" | End date: " + s1.getEndDate());
}
}