sarveshpatel commited on
Commit
359dcd9
·
verified ·
1 Parent(s): 790b55b

Create handlers/handlers.go

Browse files
Files changed (1) hide show
  1. handlers/handlers.go +274 -0
handlers/handlers.go ADDED
@@ -0,0 +1,274 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ package handlers
2
+
3
+ import (
4
+ "html/template"
5
+ "net/http"
6
+ "strings"
7
+ "tempmail-service/models"
8
+ "tempmail-service/services"
9
+ "time"
10
+
11
+ "github.com/gin-gonic/gin"
12
+ )
13
+
14
+ var mailService = services.NewMailService()
15
+
16
+ // Page Handlers
17
+
18
+ func IndexPage(c *gin.Context) {
19
+ domains, err := mailService.GetDomains()
20
+ if err != nil {
21
+ c.HTML(http.StatusInternalServerError, "index.html", gin.H{
22
+ "Error": "Failed to load domains. Please try again.",
23
+ })
24
+ return
25
+ }
26
+
27
+ c.HTML(http.StatusOK, "index.html", gin.H{
28
+ "Domains": domains,
29
+ "RandomUsername": services.GenerateUsername(),
30
+ })
31
+ }
32
+
33
+ func InboxPage(c *gin.Context) {
34
+ sessionID := c.Param("sessionId")
35
+
36
+ session, err := mailService.GetSession(sessionID)
37
+ if err != nil {
38
+ c.Redirect(http.StatusFound, "/")
39
+ return
40
+ }
41
+
42
+ messages, err := mailService.GetMessages(session.Token, 1)
43
+ if err != nil {
44
+ // Try to refresh token
45
+ if refreshErr := mailService.RefreshToken(session); refreshErr == nil {
46
+ messages, err = mailService.GetMessages(session.Token, 1)
47
+ }
48
+ }
49
+
50
+ var messageList []models.MessageSummary
51
+ if messages != nil {
52
+ messageList = messages.HydraMember
53
+ }
54
+
55
+ c.HTML(http.StatusOK, "inbox.html", gin.H{
56
+ "SessionID": sessionID,
57
+ "Email": session.Email,
58
+ "Messages": messageList,
59
+ "TotalCount": len(messageList),
60
+ "ExpiresAt": session.ExpiresAt.Format("Jan 02, 2006 15:04"),
61
+ })
62
+ }
63
+
64
+ func MessagePage(c *gin.Context) {
65
+ sessionID := c.Param("sessionId")
66
+ messageID := c.Param("messageId")
67
+
68
+ session, err := mailService.GetSession(sessionID)
69
+ if err != nil {
70
+ c.Redirect(http.StatusFound, "/")
71
+ return
72
+ }
73
+
74
+ message, err := mailService.GetMessage(session.Token, messageID)
75
+ if err != nil {
76
+ c.Redirect(http.StatusFound, "/inbox/"+sessionID)
77
+ return
78
+ }
79
+
80
+ // Mark as read
81
+ _ = mailService.MarkAsRead(session.Token, messageID)
82
+
83
+ // Process HTML content
84
+ var htmlContent template.HTML
85
+ if len(message.HTML) > 0 {
86
+ htmlContent = template.HTML(strings.Join(message.HTML, ""))
87
+ }
88
+
89
+ c.HTML(http.StatusOK, "message.html", gin.H{
90
+ "SessionID": sessionID,
91
+ "Email": session.Email,
92
+ "Message": message,
93
+ "HTMLContent": htmlContent,
94
+ })
95
+ }
96
+
97
+ // API Handlers
98
+
99
+ func GetDomains(c *gin.Context) {
100
+ domains, err := mailService.GetDomains()
101
+ if err != nil {
102
+ c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
103
+ return
104
+ }
105
+ c.JSON(http.StatusOK, gin.H{"domains": domains})
106
+ }
107
+
108
+ func CreateAccount(c *gin.Context) {
109
+ var req models.CreateEmailRequest
110
+ if err := c.ShouldBindJSON(&req); err != nil {
111
+ // If no JSON, generate random
112
+ domains, err := mailService.GetDomains()
113
+ if err != nil || len(domains) == 0 {
114
+ c.JSON(http.StatusInternalServerError, gin.H{"error": "No domains available"})
115
+ return
116
+ }
117
+ req.Username = services.GenerateUsername()
118
+ req.Domain = domains[0].Domain
119
+ }
120
+
121
+ // Validate
122
+ if req.Username == "" {
123
+ req.Username = services.GenerateUsername()
124
+ }
125
+ if req.Domain == "" {
126
+ domains, _ := mailService.GetDomains()
127
+ if len(domains) > 0 {
128
+ req.Domain = domains[0].Domain
129
+ }
130
+ }
131
+
132
+ // Validate username length (min 1 character)
133
+ if len(req.Username) < 1 {
134
+ c.JSON(http.StatusBadRequest, gin.H{"error": "Username must be at least 1 character"})
135
+ return
136
+ }
137
+
138
+ session, err := mailService.CreateSession(req.Username, req.Domain)
139
+ if err != nil {
140
+ c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
141
+ return
142
+ }
143
+
144
+ c.JSON(http.StatusCreated, gin.H{
145
+ "sessionId": session.SessionID,
146
+ "email": session.Email,
147
+ "expiresAt": session.ExpiresAt.Format(time.RFC3339),
148
+ })
149
+ }
150
+
151
+ func DeleteAccount(c *gin.Context) {
152
+ sessionID := c.Param("sessionId")
153
+
154
+ if err := mailService.DeleteSession(sessionID); err != nil {
155
+ c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
156
+ return
157
+ }
158
+
159
+ c.JSON(http.StatusOK, gin.H{"message": "Account deleted successfully"})
160
+ }
161
+
162
+ func GetAccount(c *gin.Context) {
163
+ sessionID := c.Param("sessionId")
164
+
165
+ session, err := mailService.GetSession(sessionID)
166
+ if err != nil {
167
+ c.JSON(http.StatusNotFound, gin.H{"error": err.Error()})
168
+ return
169
+ }
170
+
171
+ c.JSON(http.StatusOK, gin.H{
172
+ "sessionId": session.SessionID,
173
+ "email": session.Email,
174
+ "expiresAt": session.ExpiresAt.Format(time.RFC3339),
175
+ })
176
+ }
177
+
178
+ func GetMessages(c *gin.Context) {
179
+ sessionID := c.Param("sessionId")
180
+
181
+ session, err := mailService.GetSession(sessionID)
182
+ if err != nil {
183
+ c.JSON(http.StatusNotFound, gin.H{"error": err.Error()})
184
+ return
185
+ }
186
+
187
+ messages, err := mailService.GetMessages(session.Token, 1)
188
+ if err != nil {
189
+ // Try refresh token
190
+ if refreshErr := mailService.RefreshToken(session); refreshErr == nil {
191
+ messages, err = mailService.GetMessages(session.Token, 1)
192
+ }
193
+ if err != nil {
194
+ c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
195
+ return
196
+ }
197
+ }
198
+
199
+ c.JSON(http.StatusOK, gin.H{
200
+ "messages": messages.HydraMember,
201
+ "total": messages.TotalItems,
202
+ })
203
+ }
204
+
205
+ func GetMessage(c *gin.Context) {
206
+ sessionID := c.Param("sessionId")
207
+ messageID := c.Param("messageId")
208
+
209
+ session, err := mailService.GetSession(sessionID)
210
+ if err != nil {
211
+ c.JSON(http.StatusNotFound, gin.H{"error": "Session not found"})
212
+ return
213
+ }
214
+
215
+ message, err := mailService.GetMessage(session.Token, messageID)
216
+ if err != nil {
217
+ c.JSON(http.StatusNotFound, gin.H{"error": err.Error()})
218
+ return
219
+ }
220
+
221
+ c.JSON(http.StatusOK, message)
222
+ }
223
+
224
+ func DeleteMessage(c *gin.Context) {
225
+ sessionID := c.Param("sessionId")
226
+ messageID := c.Param("messageId")
227
+
228
+ session, err := mailService.GetSession(sessionID)
229
+ if err != nil {
230
+ c.JSON(http.StatusNotFound, gin.H{"error": "Session not found"})
231
+ return
232
+ }
233
+
234
+ if err := mailService.DeleteMessage(session.Token, messageID); err != nil {
235
+ c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
236
+ return
237
+ }
238
+
239
+ c.JSON(http.StatusOK, gin.H{"message": "Message deleted"})
240
+ }
241
+
242
+ func MarkAsRead(c *gin.Context) {
243
+ sessionID := c.Param("sessionId")
244
+ messageID := c.Param("messageId")
245
+
246
+ session, err := mailService.GetSession(sessionID)
247
+ if err != nil {
248
+ c.JSON(http.StatusNotFound, gin.H{"error": "Session not found"})
249
+ return
250
+ }
251
+
252
+ if err := mailService.MarkAsRead(session.Token, messageID); err != nil {
253
+ c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
254
+ return
255
+ }
256
+
257
+ c.JSON(http.StatusOK, gin.H{"seen": true})
258
+ }
259
+
260
+ func CheckSession(c *gin.Context) {
261
+ sessionID := c.Param("sessionId")
262
+
263
+ session, err := mailService.GetSession(sessionID)
264
+ if err != nil {
265
+ c.JSON(http.StatusNotFound, gin.H{"valid": false, "error": err.Error()})
266
+ return
267
+ }
268
+
269
+ c.JSON(http.StatusOK, gin.H{
270
+ "valid": true,
271
+ "email": session.Email,
272
+ "expiresAt": session.ExpiresAt.Format(time.RFC3339),
273
+ })
274
+ }