/
BEGIS.go
406 lines (341 loc) · 13.2 KB
/
BEGIS.go
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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
package BEGIS
import (
"encoding/json"
"log"
"net/http"
"os"
"github.com/aiteung/atapi"
"github.com/aiteung/atmessage"
"github.com/whatsauth/wa"
"go.mongodb.org/mongo-driver/bson"
)
var savedToken string
func Otorisasi(publickey, MONGOCONNSTRINGENV, dbname, collname string, r *http.Request) string {
var response Userkredensial
var auth User
response.Status = false
// Extract token from the request header
header := r.Header.Get("token")
if header == "" {
response.Message = "Header login tidak ditemukan"
return GCFReturnStruct(response)
}
// Decode token values
tokenusername := DecodeGetUsername(os.Getenv(publickey), header)
tokenrole := DecodeGetRole(os.Getenv(publickey), header)
// Create User struct with the decoded username
auth.Username = tokenusername
// Check if decoding results are valid
if tokenusername == "" || tokenrole == "" {
response.Message = "Hasil decode tidak ditemukan"
return GCFReturnStruct(response)
}
// Check if the user exists
// Successful token decoding and user validation
response.Message = "Berhasil decode token"
response.Status = true
response.Data.Username = tokenusername
response.Data.Role = tokenrole
return GCFReturnStruct(response)
}
func GCFHandler(MONGOCONNSTRINGENV, dbname, collectionname string) string {
mconn := SetConnection(MONGOCONNSTRINGENV, dbname)
datagedung := GetAllBangunan(mconn, collectionname)
return GCFReturnStruct(datagedung)
}
func LoginHandler(token, privatekey, MONGOCONNSTRINGENV, dbname, collname string, r *http.Request) string {
var response BeriPesan
response.Status = false
// Establish MongoDB connection
mconn := SetConnection(MONGOCONNSTRINGENV, dbname)
// Decode user data from the request body
var datauser User
err := json.NewDecoder(r.Body).Decode(&datauser)
// Check for JSON decoding errors
if err != nil {
response.Message = "Error parsing application/json: " + err.Error()
return GCFReturnStruct(response)
}
// Check if the user account exists
if !usernameExists(MONGOCONNSTRINGENV, dbname, datauser) {
response.Message = "Akun tidak ditemukan"
return GCFReturnStruct(response)
}
// Check if the entered password is not valid
if !IsPasswordValid(mconn, collname, datauser) {
response.Message = "Password Salah"
return GCFReturnStruct(response)
}
// Retrieve user details
user := FindUser(mconn, collname, datauser)
// Prepare and encode token
tokenstring, tokenerr := Encode(user.Username, user.Role, os.Getenv(privatekey))
if tokenerr != nil {
response.Message = "Gagal encode token: " + tokenerr.Error()
return GCFReturnStruct(response)
}
// Successful login
response.Status = true
response.Token = tokenstring
response.Message = "Berhasil login"
// Send a WhatsApp message notifying the user about the successful login
var nama = user.Username
var nohp = user.No_whatsapp
dt := &wa.TextMessage{
To: nohp,
IsGroup: false,
Messages: nama + " berhasil login\nNikmati Web Wisata di kota bandung\nIni token Untuk melanjutkan Proses selanjutnya yah " + "\n" + tokenstring,
}
atapi.PostStructWithToken[atmessage.Response]("Token", os.Getenv(token), dt, "https://api.wa.my.id/api/send/message/text")
return GCFReturnStruct(response)
}
func GCFReturnStruct(DataStuct any) string {
jsondata, _ := json.Marshal(DataStuct)
return string(jsondata)
}
func GCFLoginAfterCreatee(MONGOCONNSTRINGENV, dbname, collectionname string, r *http.Request) string {
mconn := SetConnection(MONGOCONNSTRINGENV, dbname)
var userdata User
err := json.NewDecoder(r.Body).Decode(&userdata)
if err != nil {
return err.Error()
}
if IsPasswordValid(mconn, collectionname, userdata) {
// Password is valid, return a success message or some other response.
return "Login successful"
} else {
// Password is not valid, return an error message.
return "Password Salah"
}
}
func GCFLoginAfterCreateee(MONGOCONNSTRINGENV, dbname, collectionname string, r *http.Request) string {
mconn := SetConnection(MONGOCONNSTRINGENV, dbname)
var userdata User
err := json.NewDecoder(r.Body).Decode(&userdata)
if err != nil {
return err.Error()
}
if IsPasswordValid(mconn, collectionname, userdata) {
// Password is valid, construct and return the GCFReturnStruct.
response := CreateResponse(true, "Berhasil Login", userdata)
return GCFReturnStruct(response) // Return GCFReturnStruct directly
} else {
// Password is not valid, return an error message.
return "Password Salah"
}
}
func GCFLoginAfterCreateeee(MONGOCONNSTRINGENV, dbname, collectionname string, r *http.Request) string {
mconn := SetConnection(MONGOCONNSTRINGENV, dbname)
var userdata User
err := json.NewDecoder(r.Body).Decode(&userdata)
if err != nil {
return err.Error()
}
if IsPasswordValid(mconn, collectionname, userdata) {
// Password is valid, return a success message or some other response.
return GCFReturnStruct(userdata)
} else {
// Password is not valid, return an error message.
return "Password Salah"
}
}
func GCFCreteCommnet(MONGOCONNSTRINGENV, dbname, collectionname string, r *http.Request) string {
mconn := SetConnection(MONGOCONNSTRINGENV, dbname)
var commentdata Comment
err := json.NewDecoder(r.Body).Decode(&commentdata)
if err != nil {
return err.Error()
}
if err := CreateComment(mconn, collectionname, commentdata); err != nil {
return GCFReturnStruct(CreateResponse(true, "Succes Create Comment", commentdata))
} else {
return GCFReturnStruct(CreateResponse(false, "Failed Create Comment", commentdata))
}
}
func GCFGetAllComment(MONGOCONNSTRINGENV, dbname, collectionname string) string {
mconn := SetConnection(MONGOCONNSTRINGENV, dbname)
datacomment := GetAllComment(mconn, collectionname)
if datacomment != nil {
return GCFReturnStruct(CreateResponse(true, "success Get All Comment", datacomment))
} else {
return GCFReturnStruct(CreateResponse(false, "Failed Get All Comment", datacomment))
}
}
func GFCUpadatedCommnet(MONGOCONNSTRINGENV, dbname, collectionname string, r *http.Request) string {
mconn := SetConnection(MONGOCONNSTRINGENV, dbname)
var commentdata Comment
err := json.NewDecoder(r.Body).Decode(&commentdata)
if err != nil {
return err.Error()
}
if err := UpdatedComment(mconn, collectionname, bson.M{"id": commentdata.ID}, commentdata); err != nil {
return GCFReturnStruct(CreateResponse(true, "Success Updated Comment", commentdata))
} else {
return GCFReturnStruct(CreateResponse(false, "Failed Updated Comment", commentdata))
}
}
func GCFDeletedCommnet(MONGOCONNSTRINGENV, dbname, collectionname string, r *http.Request) string {
mconn := SetConnection(MONGOCONNSTRINGENV, dbname)
var commentdata Comment
if err := json.NewDecoder(r.Body).Decode(&commentdata); err != nil {
return GCFReturnStruct(CreateResponse(false, "Failed to process request", commentdata))
}
if err := DeleteComment(mconn, collectionname, commentdata); err != nil {
return GCFReturnStruct(CreateResponse(true, "Successfully deleted comment", commentdata))
}
return GCFReturnStruct(CreateResponse(false, "Failed to delete comment", commentdata))
}
func GCFCreatePostLineStringg(MONGOCONNSTRINGENV, dbname, collection string, r *http.Request) string {
mconn := SetConnection(MONGOCONNSTRINGENV, dbname)
var geojsonline GeoJsonLineString
err := json.NewDecoder(r.Body).Decode(&geojsonline)
if err != nil {
return err.Error()
}
// Mengambil nilai header PASETO dari permintaan HTTP
pasetoValue := r.Header.Get("PASETOPRIVATEKEYENV")
// Disini Anda dapat menggunakan nilai pasetoValue sesuai kebutuhan Anda
// Misalnya, menggunakannya untuk otentikasi atau enkripsi.
// Contoh sederhana menambahkan nilainya ke dalam pesan respons:
response := GCFReturnStruct(geojsonline)
response += " PASETO value: " + pasetoValue
PostLinestring(mconn, collection, geojsonline)
return response
}
func GCFCreatePostLineString(MONGOCONNSTRINGENV, dbname, collection string, r *http.Request) string {
mconn := SetConnection(MONGOCONNSTRINGENV, dbname)
var geojsonline GeoJsonLineString
err := json.NewDecoder(r.Body).Decode(&geojsonline)
if err != nil {
return err.Error()
}
PostLinestring(mconn, collection, geojsonline)
return GCFReturnStruct(geojsonline)
}
func GCFDeleteLineString(MONGOCONNSTRINGENV, dbname, collectionname string, r *http.Request) string {
mconn := SetConnection(MONGOCONNSTRINGENV, dbname)
var dataline GeoJsonLineString
err := json.NewDecoder(r.Body).Decode(&dataline)
if err != nil {
return err.Error()
}
if err := DeleteLinestring(mconn, collectionname, dataline); err != nil {
return GCFReturnStruct(CreateResponse(true, "Success Delete LineString", dataline))
} else {
return GCFReturnStruct(CreateResponse(false, "Failed Delete LineString", dataline))
}
}
func GCFUpdateLinestring(MONGOCONNSTRINGENV, dbname, collectionname string, r *http.Request) string {
mconn := SetConnection(MONGOCONNSTRINGENV, dbname)
var dataline GeoJsonLineString
err := json.NewDecoder(r.Body).Decode(&dataline)
if err != nil {
return err.Error()
}
if err := UpdatedLinestring(mconn, collectionname, bson.M{"properties.coordinates": dataline.Geometry.Coordinates}, dataline); err != nil {
return GCFReturnStruct(CreateResponse(true, "Success Update LineString", dataline))
} else {
return GCFReturnStruct(CreateResponse(false, "Failed Update LineString", dataline))
}
}
func validateToken(token string) bool {
return token == savedToken
}
func GCFCreateLineStringgg(MONGOCONNSTRINGENV, dbname, collectionname string, r *http.Request) string {
// MongoDB Connection Setup
mconn := SetConnection(MONGOCONNSTRINGENV, dbname)
// Parsing Request Body
var dataline GeoJsonLineString
err := json.NewDecoder(r.Body).Decode(&dataline)
if err != nil {
return err.Error()
}
// Get the token from the Authorization header
token := r.Header.Get("Authorization")
if token == "" {
return GCFReturnStruct(CreateResponse(false, "Unauthorized: Token is missing", nil))
}
// Handling Authorization by validating the token
if validateToken(token) {
// Perform the action (e.g., PostLinestring)
err := PostLinestring(mconn, collectionname, dataline)
if err != nil {
return GCFReturnStruct(CreateResponse(false, "Data Sukses terinput Coy", nil))
}
// Success
return GCFReturnStruct(CreateResponse(true, "Success: LineString created", dataline))
}
return GCFReturnStruct(CreateResponse(false, "Unauthorized: Invalid token", nil))
}
func GCFCreatePolygone(MONGOCONNSTRINGENV, dbname, collectionname string, r *http.Request) string {
// MongoDB Connection Setup
mconn := SetConnection(MONGOCONNSTRINGENV, dbname)
// Parsing Request Body1
var datapolygone GeoJsonPolygon
err := json.NewDecoder(r.Body).Decode(&datapolygone)
if err != nil {
return err.Error()
}
// Handling Authorization
if err := PostPolygone(mconn, collectionname, datapolygone); err != nil {
// Success
return GCFReturnStruct(CreateResponse(true, "Success Create Polygone", datapolygone))
} else {
// Failure
return GCFReturnStruct(CreateResponse(false, "Failed Create Polygone", datapolygone))
}
}
func GCFlineStingCreate(MONGOCONNSTRINGENV, dbname, collection string, r *http.Request) string {
mconn := SetConnection(MONGOCONNSTRINGENV, dbname)
var geojsonline GeoJsonLineString
err := json.NewDecoder(r.Body).Decode(&geojsonline)
if err != nil {
return err.Error()
}
PostLinestring(mconn, collection, geojsonline)
return GCFReturnStruct(geojsonline)
}
func GCFlineStingCreatea(MONGOCONNSTRINGENV, dbname, collection string, r *http.Request) string {
// MongoDB Connection Setup
mconn := SetConnection(MONGOCONNSTRINGENV, dbname)
// Parsing Request Body
var geojsonline GeoJsonLineString
err := json.NewDecoder(r.Body).Decode(&geojsonline)
if err != nil {
return GCFReturnStruct(CreateResponse(false, "Bad Request: Invalid JSON", nil))
}
// Checking Secret Header
secretHeader := r.Header.Get("Secret")
expectedSecret := os.Getenv("SECRET")
if secretHeader != expectedSecret {
log.Printf("Unauthorized: Secret header does not match. Expected: %s, Actual: %s", expectedSecret, secretHeader)
return GCFReturnStruct(CreateResponse(false, "Unauthorized: Secret header does not match", nil))
}
// Handling Authorization
PostLinestring(mconn, collection, geojsonline)
return GCFReturnStruct(CreateResponse(true, "Success: LineString created", geojsonline))
}
func GCFCreatePolygonee(MONGOCONNSTRINGENV, dbname, collectionname string, r *http.Request) string {
// MongoDB Connection Setup
mconn := SetConnection(MONGOCONNSTRINGENV, dbname)
// Parsing Request Body
var datapolygone GeoJsonPolygon
err := json.NewDecoder(r.Body).Decode(&datapolygone)
if err != nil {
return GCFReturnStruct(CreateResponse(false, "Bad Request: Invalid JSON", nil))
}
// Checking Secret Header
secretHeader := r.Header.Get("Secret")
expectedSecret := os.Getenv("SECRET")
if secretHeader != expectedSecret {
log.Printf("Unauthorized: Secret header does not match. Expected: %s, Actual: %s", expectedSecret, secretHeader)
return GCFReturnStruct(CreateResponse(false, "Unauthorized: Secret header does not match", nil))
}
// Handling Authorization
if err := PostPolygone(mconn, collectionname, datapolygone); err != nil {
log.Printf("Error creating polygon: %v", err)
return GCFReturnStruct(CreateResponse(false, "Failed Create Polygone", nil))
}
log.Println("Success: Polygon created")
return GCFReturnStruct(CreateResponse(true, "Success Create Polygone", datapolygone))
}