File size: 29,794 Bytes
9adc91d
 
1177d61
7beb700
158bb31
212dffe
 
1177d61
9adc91d
 
158bb31
 
9adc91d
 
 
158bb31
 
 
 
9adc91d
 
 
158bb31
 
9adc91d
 
 
158bb31
9adc91d
 
1f7dd45
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4f90512
 
 
 
 
 
 
 
aa83ff3
 
 
4f90512
 
 
 
 
 
 
 
 
1f7dd45
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
aa83ff3
 
 
 
1f7dd45
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
aa83ff3
0199ba6
57e875f
 
aa83ff3
 
 
57e875f
 
0199ba6
 
 
aa83ff3
 
0199ba6
57e875f
0199ba6
 
57e875f
 
 
0199ba6
 
 
aa83ff3
 
57e875f
0199ba6
 
 
 
 
 
 
 
aa83ff3
 
0199ba6
aa83ff3
0199ba6
 
 
 
aa83ff3
 
 
0199ba6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cddf8b2
 
 
 
 
 
 
 
 
 
 
0199ba6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5a84566
0199ba6
 
 
 
aa83ff3
 
 
a020582
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9adc91d
 
158bb31
 
 
 
9adc91d
 
 
158bb31
9adc91d
 
158bb31
 
9adc91d
 
 
158bb31
9adc91d
 
a020582
 
 
 
 
 
cabfcc4
 
 
 
 
 
 
 
 
 
 
9adc91d
58a3ab8
 
 
158bb31
 
 
 
 
 
 
 
 
 
 
 
 
1cea019
158bb31
 
58a3ab8
 
 
 
 
 
 
1cea019
 
158bb31
 
1cea019
158bb31
 
 
58a3ab8
 
 
 
1cea019
 
58a3ab8
 
1cea019
58a3ab8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1301478
 
 
1cea019
 
 
1301478
 
 
158bb31
 
58a3ab8
 
 
 
 
158bb31
 
 
 
 
 
1cea019
 
158bb31
1cea019
158bb31
 
58a3ab8
 
 
 
 
54de00c
 
 
 
 
 
1cea019
 
54de00c
 
 
57e875f
54de00c
 
 
57e875f
 
54de00c
 
58a3ab8
 
 
 
 
 
 
 
1cea019
58a3ab8
 
 
 
 
 
 
 
 
1cea019
158bb31
 
 
 
 
 
58a3ab8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1cea019
58a3ab8
 
 
 
 
 
 
 
 
1cea019
58a3ab8
 
 
 
 
158bb31
 
58a3ab8
 
 
 
 
 
 
 
 
158bb31
 
 
7beb700
58a3ab8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7beb700
 
 
 
 
 
 
 
6b959b3
58a3ab8
 
 
 
 
57e875f
 
 
 
 
 
 
 
 
 
6b959b3
9adc91d
1301478
54de00c
 
 
1301478
54de00c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f3f5b2d
 
54de00c
 
 
 
 
 
 
 
f3f5b2d
 
 
 
 
 
54de00c
 
 
 
c2003d2
 
 
 
54de00c
 
 
 
 
 
 
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
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
package models

import (
	"mime/multipart"
	"time"

	"github.com/lib/pq"
)

type LoginRequest struct {
	Email    string `json:"email" binding:"required"`
	Password string `json:"password" binding:"required"`
}

type RegisterRequest struct {
	Name     string `json:"name"`
	Email    string `json:"email" binding:"required,email"`
	Phone    int    `json:"phone"`
	Password string `json:"password" binding:"required"`
}

type ChangePasswordRequest struct {
	OldPassword string `json:"old_password" binding:"required" `
	NewPassword string `json:"new_password" binding:"required" `
}

type CreateVerifyEmailRequest struct {
	Token uint `json:"token" binding:"required"`
}

type (
	CreateAcademyRequest struct {
		AccountID   int64  `json:"account_id"`
		Title       string `json:"title" validate:"required"`
		Description string `json:"description"`
		Order       *uint  `json:"order"`
	}

	UpdateAcademyRequest struct {
		ID          int64   `json:"id"`
		Title       *string `json:"title"`
		Description *string `json:"description"`
		Order       *uint   `json:"order"`
	}

	AcademyResponse struct {
		Academy
		TotalMaterial int64 `gorm:"total_material" json:"total_material"`
	}

	UserAcademyResponse struct {
		Academy
		TotalMaterial          int64   `gorm:"total_material" json:"total_material"`
		TotalReadMaterial      int64   `gorm:"total_read_material" json:"total_read_material"`
		PercentageReadMaterial float64 `gorm:"percentage_read_material" json:"percentage_read_material"`
	}

	UserAcademyMaterialResponse struct {
		ID        int64      `gorm:"column:id" json:"id"`
		AcademyID int64      `gorm:"column:academy_id" json:"academy_id"`
		Title     string     `gorm:"column:title" json:"title"`
		Slug      string     `gorm:"column:slug" json:"slug"`
		Order     uint       `gorm:"column:order" json:"order"`
		CreatedAt *time.Time `gorm:"column:read_created_at" json:"created_at"`
		UpdatedAt *time.Time `gorm:"column:read_updated_at" json:"updated_at"`
		IsRead    bool       `gorm:"is_read" json:"is_read"`
	}

	UserAcademyMaterialDetailResponse struct {
		ID        int64      `gorm:"column:id" json:"id"`
		AcademyID int64      `gorm:"column:academy_id" json:"academy_id"`
		Title     string     `gorm:"column:title" json:"title"`
		Slug      string     `gorm:"column:slug" json:"slug"`
		Content   string     `gorm:"column:content" json:"content"`
		Order     uint       `gorm:"column:order" json:"order"`
		CreatedAt *time.Time `gorm:"column:read_created_at" json:"created_at"`
		UpdatedAt *time.Time `gorm:"column:read_updated_at" json:"updated_at"`
		IsRead    bool       `gorm:"is_read" json:"is_read"`
	}

	CreateAcademyMaterialRequest struct {
		AcademyID int64  `json:"academy_id" validate:"required"`
		Title     string `json:"title" validate:"required"`
		Content   string `json:"content"`
		Order     *uint  `json:"order"`
	}

	UpdateAcademyMaterialRequest struct {
		ID      int64   `json:"id"`
		Title   *string `json:"title"`
		Content *string `json:"content"`
		Order   *uint   `json:"order"`
	}

	ListAcademyRequest struct {
		AccountID int64
		Filter
	}

	ListAcademyMaterialRequest struct {
		AccountID int64
		AcademyID int64
		Slug      string
		Filter
	}

	ListAcademyContentRequest struct {
		AccountID         int64
		AcademyID         int64
		AcademyMaterialID int64
		Filter
	}

	ReorderRequest struct {
		ID    int64 `json:"id"`
		Order int64 `json:"order"`
	}

	ReorderAcademyRequest struct {
		Reorder []ReorderRequest `json:"reorder"`
	}

	ReorderAcademyMaterialRequest struct {
		AcademyID int64            `json:"academy_id"`
		Reorder   []ReorderRequest `json:"reorder"`
	}

	ToggleAcademyMaterialProgressRequest struct {
		AccountID    int64  `json:"-"`
		MaterialSlug string `json:"-"`
		AcademySlug  string `json:"-"`
		IsRead       bool   `json:"is_read"`
	}
)

func NewListAcademyRequest() ListAcademyRequest {
	return ListAcademyRequest{
		Filter: NewFilter(),
	}
}

func NewListAcademyMaterialRequest() ListAcademyMaterialRequest {
	return ListAcademyMaterialRequest{
		Filter: NewFilter(),
	}
}

func NewListAcademyContentRequest() ListAcademyContentRequest {
	return ListAcademyContentRequest{
		Filter: NewFilter(),
	}
}

type (
	// GET QUIZ
	UserGetQuizRequest struct {
		AccountID int64 `json:"account_id" validate:"required"`
		AcademyID int64 `json:"academy_id" validate:"required"`
	}

	UserGetQuizResponse struct {
		Quiz
		TotalQuestions   int64 `json:"total_questions"`
		UserAttempts     int64 `json:"user_attempts"`
		HasActiveAttempt bool  `json:"has_active_attempt"`
	}

	// ATTEMP QUIZ
	UserAttemptQuizRequest struct {
		AccountID int64 `json:"account_id" validate:"required"`
		AcademyID int64 `json:"academy_id" validate:"required"`
	}

	UserAttemptQuizQuestionsResponse struct {
		ID         int64 `json:"id"`
		IsDoubt    bool  `json:"is_doubt"`
		IsAnswered bool  `json:"is_answered"`
	}

	UserAttemptQuizResponse struct {
		ID         int64                              `json:"id"`
		AccountID  int64                              `json:"account_id"`
		QuizID     int64                              `json:"quiz_id"`
		StartedAt  time.Time                          `json:"started_at"`
		DueAt      time.Time                          `json:"due_at"`
		FinishedAt *time.Time                         `json:"finished_at"`
		Score      float64                            `json:"score"`
		Questions  []UserAttemptQuizQuestionsResponse `json:"questions"`
	}

	// GET QUESTION
	GetQuestionQuizRequest struct {
		AccountID  int64 `json:"account_id" validate:"required"`
		AcademyID  int64 `json:"academy_id" validate:"required"`
		AttemptID  int64 `json:"attempt_id" validate:"required"`
		QuestionID int64 `json:"question_id" validate:"required"`
	}

	GetQuestionQuizResponse struct {
		Question struct {
			ID      int64  `json:"id"`
			QuizID  int64  `json:"quiz_id"`
			Content string `json:"content"`
		} `json:"question"`
		AnswerOptions []struct {
			ID      int64  `json:"id"`
			Content string `json:"content"`
		} `json:"answer_options"`
		AnswerID   *int64 `json:"answer_id"`
		IsDoubt    bool   `json:"is_doubt"`
		IsAnswered bool   `json:"is_answered"`
	}

	// ANSWER QUESTION
	AnswerQuizRequest struct {
		AccountID int64 `json:"account_id" validate:"required"`
		AcademyID int64 `json:"academy_id" validate:"required"`
		AttemptID int64 `json:"attempt_id" validate:"required"`

		QuestionID int64  `json:"question_id" validate:"required"`
		AnswerID   *int64 `json:"answer_id"`
		IsDoubt    bool   `json:"is_doubt"`
	}

	// SUBMIT QUIZ
	SubmitQuizRequest struct {
		AccountID int64 `json:"account_id" validate:"required"`
		AcademyID int64 `json:"academy_id" validate:"required"`
		AttemptID int64 `json:"attempt_id" validate:"required"`
	}

	SubmitQuizResponse struct {
		QuizAttempt
		RemainingAttempts int64 `json:"remaining_attempts" validate:"required"`
	}

	// RESULT QUIZ
	ResultQuizRequest struct {
		AccountID int64 `json:"account_id" validate:"required"`
		AcademyID int64 `json:"academy_id" validate:"required"`
	}

	ResultQuizResponse struct {
		QuizAttempt
		RemainingAttempts int64 `json:"remaining_attempts" validate:"required"`
	}

	// REVIEW QUIZ
	ReviewQuizRequest struct {
		AccountID int64 `json:"account_id" validate:"required"`
		AcademyID int64 `json:"academy_id" validate:"required"`
	}

	ReviewQuizQuestion struct {
		ID      int64  `gorm:"column:id;primaryKey;autoIncrement"  json:"id"`
		QuizID  int64  `gorm:"column:quiz_id;not null" json:"quiz_id"`
		Content string `gorm:"column:content" json:"content"`
		Review  string `gorm:"column:review" json:"review"`
	}

	ReviewQuiz struct {
		Question      ReviewQuizQuestion `json:"question"`
		AnswerOptions []struct {
			ID        int64  `json:"id"`
			Content   string `json:"content"`
			IsCorrect bool   `json:"is_correct"`
		} `json:"answer_options"`
		AnswerID *int64 `json:"answer_id"`
	}

	ReviewQuizResponse struct {
		Reviews []ReviewQuiz
	}
)

type (
	MultipleOptionsRequest struct {
		OptionName  string   `json:"option_name" validate:"required"`
		OptionValue []string `json:"option_values" validate:"required"`
	}

	CreateOptionsRequest struct {
		Options []MultipleOptionsRequest `json:"options" validate:"required"`
	}

	CreateOptionsResponse struct {
		Options []Options `json:"options"`
	}

	ListOptionsResponse struct {
		Options []Options `json:"options"`
	}

	ListOptionsBySlugRequest struct {
		Slug string `json:"slug"`
	}

	ListOptionsBySlugResponse struct {
		OptionCategory *OptionCategory `json:"option_category"`
		OptionValues   []OptionValues  `json:"option_values"`
	}
)

type ExternalAuthRequest struct {
	OauthID         string `json:"oauth_id" binding:"required"`
	OauthProvider   string `json:"oauth_provider" binding:"required"`
	IsAgreeTerms    bool   `json:"is_agree_terms"`
	IsSexualDisease bool   `json:"is_sexual_disease"`
}

type ForgotPasswordRequest struct {
	Email string `json:"email" binding:"required,email"`
}
type ValidateForgotPasswordRequest struct {
	Token       uint   `json:"token" binding:"required"`
	NewPassword string `json:"new_password"`
}

type QuestionQuizRequest struct {
	QuestionNo int `json:"question_no" binding:"required"`
}

type (
	ListCitiesByProvinceIdRequest struct {
		ProvinceID int64 `json:"province_id" binding:"required"`
	}
)

type (
	CreateEmailVerificationRequest struct {
		AccountID int64 `json:"-"`
	}

	ValidateEmailVerificationRequest struct {
		AccountID int64 `json:"-"`
		Token     int64 `json:"token" validate:"required"`
	}
)

type (
	SavePersonalityAndPreferenceRequest struct {
		AccountID int64 `json:"-"`

		PositiveTraits        *string `json:"positive_traits"`                              // sifat positif
		NegativeTraits        *string `json:"negative_traits"`                              // sifat negatif
		Hobbies               *string `json:"hobbies"`                                      // hobi
		LifeGoals             *string `json:"life_goals"`                                   // target hidup
		DailyActivities       *string `json:"daily_activities"`                             // kegiatan sehari-hari
		LeisureActivities     *string `json:"leisure_activities"`                           // kegiatan waktu luang
		Likes                 *string `json:"likes"`                                        // hal yang disukai
		Dislikes              *string `json:"dislikes"`                                     // hal yang tidak disukai
		StressHandling        *string `json:"stress_handling"`                              // cara mengatasi stres
		AngerTriggers         *string `json:"anger_triggers"`                               // pemicu amarah
		FavoriteFoodAndDrinks *string `json:"favorite_food_and_drinks"`                     // makanan dan minuman favorit
		CanCook               *bool   `json:"can_cook"`                                     // bisa memasak
		TypesOfDishesCooked   *string `json:"types_of_dishes_cooked"`                       // jenis masakan yang bisa dimasak
		MonthlyExpenses       *string `json:"monthly_expenses" validate:"monthly-expenses"` // pengeluaran per bulan
	}

	GetPersonalityAndPreferenceRequest struct {
		AccountID int64 `json:"-"`
	}

	CreateFamilyMemberRequest struct {
		AccountID int64 `json:"-"`

		Role          *string `json:"role" validate:"family-role"`              // Peran dalam keluarga
		Status        *string `json:"status" validate:"life-status"`            // Status (Hidup, Wafat)
		Religion      *string `json:"religion" validate:"religion"`             // Agama
		Job           *string `json:"job"`                                      // Pekerjaan
		LastEducation *string `json:"last_education" validate:"last-education"` // Pendidikan terakhir
		Age           *int    `json:"age"`                                      // Usia
	}

	UpdateFamilyMemberRequest struct {
		ID        int64 `json:"-"`
		AccountID int64 `json:"-"`

		Role          *string `json:"role" validate:"family-role"`              // Peran dalam keluarga
		Status        *string `json:"status" validate:"life-status"`            // Status (Hidup, Wafat)
		Religion      *string `json:"religion" validate:"religion"`             // Agama
		Job           *string `json:"job"`                                      // Pekerjaan
		LastEducation *string `json:"last_education" validate:"last-education"` // Pendidikan terakhir
		Age           *int    `json:"age"`                                      // Usia
	}

	ListFamilyMemberRequest struct {
		AccountID int64 `json:"-"`
	}

	GetFamilyMemberRequest struct {
		ID int64 `json:"-"`
	}

	DeleteFamilyMemberRequest struct {
		ID int64 `json:"-"`
	}

	SavePhysicalAndHealthRequest struct {
		AccountID        int64           `json:"-"`
		HeightInCm       *int            `json:"height_cm"`                        // Tinggi badan dalam satuan sentimeter
		WeightInKg       *int            `json:"weight_kg"`                        // Berat badan dalam satuan kilogram
		BodyShape        *string         `json:"body_shape" validate:"body-shape"` // Bentuk tubuh
		SkinColor        *string         `json:"skin_color" validate:"skin-color"` // Warna kulit
		HairType         *string         `json:"hair_type" validate:"hair-type"`   // Tipe rambut
		MedicalHistory   *pq.StringArray `json:"medical_history"`                  // Riwayat penyakit
		PhysicalDisorder *string         `json:"physical_disorder"`                // Cacat fisik
		PhysicalTraits   *string         `json:"physical_traits"`                  // Ciri khas fisik
	}

	GetPhysicalAndHealthRequest struct {
		AccountID int64 `json:"-"`
	}

	SaveAccountDetailsRequest struct {
		AccountID     int64      `json:"-"`
		FullName      *string    `json:"full_name"`
		Gender        *string    `json:"gender" validate:"gender"`
		DateOfBirth   *time.Time `json:"date_of_birth"`
		PlaceOfBirth  *string    `json:"place_of_birth"`
		Domicile      *string    `json:"domicile"`
		MaritalStatus *string    `json:"marital_status" validate:"marital-status"`
		LastEducation *string    `json:"last_education" validate:"last-education"`
		LastJob       *string    `json:"last_job"`
		PhoneNumber   *string    `json:"phone_number" validate:"phone-number"`
	}

	GetAccountDetailsRequest struct {
		AccountID int64 `json:"account_id"`
	}

	SaveWorshipAndReligiousUnderstandingRequest struct {
		AccountID                     int64           `json:"-"`
		ObligatoryPrayer              *string         `json:"obligatory_prayer"`                                                            // sholat_wajib_5_waktu
		CongregationalPrayer          *string         `json:"congregational_prayer"`                                                        // sholat_berjamaah_di_masjid
		TahajjudPrayer                *string         `json:"tahajjud_prayer"`                                                              // sholat_tahajud
		DhuhaPrayer                   *string         `json:"dhuha_prayer"`                                                                 // sholat_dhuha
		QuranMemorization             *string         `json:"quran_memorization"`                                                           // hafalan_alquran
		QuranReadingAbility           *string         `json:"quran_reading_ability" validate:"quran-reading-ability"`                       // kemampuan_baca_alquran
		WeeklyReligiousStudyFrequency *string         `json:"weekly_religious_study_frequency" validate:"weekly-religious-study-frequency"` // kajian_yang_diikuti_dalam_sepekan
		DaudFasting                   *string         `json:"daud_fasting"`                                                                 // puasa_daud
		AyyamulBidhFasting            *string         `json:"ayyamul_bidh_fasting"`                                                         // puasa_ayyamul_bidh
		HajjOrUmrah                   *pq.StringArray `json:"hajj_or_umrah"`                                                                // ibadah_haji_umroh
		ListeningToMusic              *bool           `json:"listening_to_music"`                                                           // mendengarkan_musik
		OpinionOnIkhtilat             *string         `json:"opinion_on_ikhtilat"`                                                          // pendapat_ikhtilat
		OpinionOnTouchingNonMahram    *string         `json:"opinion_on_touching_non_mahram"`                                               // pendapat_menyentuh_non_mahram
		OpinionOnVeil                 *string         `json:"opinion_on_veil"`                                                              // pendapat_tentang_cadar
		OpinionOnBeard                *string         `json:"opinion_on_beard"`                                                             // pendapat_tentang_jenggot_pada_laki_laki
		OpinionOnPantsAboveAnkle      *string         `json:"opinion_on_pants_above_ankle"`                                                 // pendapat_tentang_celana_di_atas_mata_kaki
		WeeklyReligiousStudies        *string         `json:"weekly_religious_studies"`                                                     // kajian_yang_diikuti_dalam_sepekan
		FollowedUstadz                *string         `json:"followed_ustadz"`                                                              // ustadz_yang_diikuti
	}

	GetWorshipAndReligiousUnderstandingRequest struct {
		AccountID int64 `json:"-"`
	}

	CreateEducationRequest struct {
		AccountID          int64   `json:"-"`
		LastEducation      *string `json:"last_education" validate:"last-education"` // pendidikan terakhir
		EducationInstitute *string `json:"education_institute"`                      // institusi pendidikan
		EducationMajor     *string `json:"education_major"`                          // jurusan pendidikan
		YearStart          *int    `json:"year_start"`                               // tahun masuk
		YearGraduate       *int    `json:"year_graduate"`                            // tahun lulus
	}

	UpdateEducationRequest struct {
		ID                 int64   `json:"-"`
		AccountID          int64   `json:"-"`
		LastEducation      *string `json:"last_education" validate:"last-education"` // pendidikan terakhir
		EducationInstitute *string `json:"education_institute"`                      // institusi pendidikan
		EducationMajor     *string `json:"education_major"`                          // jurusan pendidikan
		YearStart          *int    `json:"year_start"`                               // tahun masuk
		YearGraduate       *int    `json:"year_graduate"`                            // tahun lulus
	}

	ListEducationRequest struct {
		AccountID int64 `json:"-"`
	}

	GetEducationRequest struct {
		ID int64 `json:"-"`
	}

	DeleteEducationRequest struct {
		ID int64 `json:"-"`
	}

	CreateJobRequest struct {
		AccountID          int64           `json:"account_id"`
		InstitutionName    *string         `json:"institution_name"`                         // nama instansi
		CurrentJob         *string         `json:"current_job"`                              // pekerjaan saat ini
		YearStartedWorking *int            `json:"year_started_working"`                     // tahun mulai bekerja
		MonthlyIncome      *string         `json:"monthly_income" validate:"monthly-income"` // penghasilan per bulan
		IncomeSources      *pq.StringArray `json:"income_sources"`                           // sumber penghasilan
	}

	UpdateJobRequest struct {
		ID                 int64           `json:"-"`
		AccountID          int64           `json:"-"`
		InstitutionName    *string         `json:"institution_name"`                         // nama instansi
		CurrentJob         *string         `json:"current_job"`                              // pekerjaan saat ini
		YearStartedWorking *int            `json:"year_started_working"`                     // tahun mulai bekerja
		MonthlyIncome      *string         `json:"monthly_income" validate:"monthly-income"` // penghasilan per bulan
		IncomeSources      *pq.StringArray `json:"income_sources"`                           // sumber penghasilan
	}

	ListJobRequest struct {
		AccountID int64 `json:"-"`
	}

	GetJobRequest struct {
		ID int64 `json:"-"`
	}

	DeleteJobRequest struct {
		ID int64 `json:"-"`
	}

	CreateAchievementRequest struct {
		AccountID          int64   `json:"account_id"`
		AchievementOrAward *string `json:"achievement_or_award"` // prestasi atau penghargaan
	}

	UpdateAchievementRequest struct {
		ID                 int64   `json:"-"`
		AccountID          int64   `json:"-"`
		AchievementOrAward *string `json:"achievement_or_award"` // prestasi atau penghargaan
	}

	ListAchievementRequest struct {
		AccountID int64 `json:"-"`
	}

	GetAchievementRequest struct {
		ID int64 `json:"-"`
	}

	DeleteAchievementRequest struct {
		ID int64 `json:"-"`
	}

	UploadProfileImageRequest struct {
		AccountID int64
		File      *multipart.FileHeader
	}

	UploadProfileImageResponse struct {
		URL string `json:"url"`
	}

	GetProgressCVRequest struct {
		AccountID int64 `json:"-"`
	}

	GetProgressCVResponse struct {
		AccountDetailsProgress             float64 `json:"account_details_progress"`
		PersonalityAndPreferenceCVProgress float64 `json:"personality_and_preference_cv_progress"`
		FamilyMemberCVProgress             float64 `json:"family_member_cv_progress"`
		PhysicalAndHealthCVProgress        float64 `json:"physical_and_health_cv_progress"`
		WorshipCVProgress                  float64 `json:"worship_cv_progress"`
		ReligiousUnderstandingCVProgress   float64 `json:"religious_understanding_cv_progress"`
		EducationCVProgress                float64 `json:"education_cv_progress"`
		JobCVProgress                      float64 `json:"job_cv_progress"`
		AchievementCVProgress              float64 `json:"achievement_cv_progress"`
		TotalProgress                      float64 `json:"total_progress"`
	}
)

type (
	SaveMarriageReadinessProfileRequest struct {
		AccountID int64 `json:"account_id"`

		// Visi Misi Rumah Tangga
		MarriageVision     *string `gorm:"column:marriage_vision" json:"marriage_vision"`         // Apa visi dan tujuan utama kamu dalam membangun rumah tangga?
		LivingPlan         *string `gorm:"column:living_plan" json:"living_plan"`                 // Setelah menikah, kamu berencana tinggal di mana?
		SpouseRoles        *string `gorm:"column:spouse_roles" json:"spouse_roles"`               // Menurutmu, apa peran utama suami dan istri dalam rumah tangga?
		SpouseRights       *string `gorm:"column:spouse_rights" json:"spouse_rights"`             // Apa saja hak suami dan istri menurutmu?
		ConflictResolution *string `gorm:"column:conflict_resolution" json:"conflict_resolution"` // Jika terjadi konflik, bagaimana kamu menyikapinya?
		ParentingStyle     *string `gorm:"column:parenting_style" json:"parenting_style"`         // Setelah punya anak, pola pengasuhan seperti apa yang kamu inginkan?

		// Konsep Acara Pernikahan
		ReadyToMarryDuration *string `gorm:"column:ready_to_marry_duration" json:"ready_to_marry_duration"` // Setelah taaruf dimulai, berapa lama kamu butuh untuk siap menikah?
		WeddingConcept       *string `gorm:"column:wedding_concept" json:"wedding_concept"`                 // Seperti apa konsep pernikahan yang kamu harapkan?
		WeddingFunding       *string `gorm:"column:wedding_funding" json:"wedding_funding"`                 // Apakah kamu sudah mempersiapkan dana pernikahan? Dari mana sumbernya?

		// Karir Kedepannya
		CareerAfterMarriage *string `gorm:"column:career_after_marriage" json:"career_after_marriage"` // Apakah kamu ingin tetap bekerja setelah menikah?
		TimeManagement      *string `gorm:"column:time_management" json:"time_management"`             // Bagaimana kamu membagi waktu antara keluarga, ibadah, dan pekerjaan?
		CareerGoals         *string `gorm:"column:career_goals" json:"career_goals"`                   // Apa impian karier atau cita-cita kamu dalam 5 sampai 10 tahun ke depan?
		SelfDevelopment     *string `gorm:"column:self_development" json:"self_development"`           // Apa usaha kamu untuk terus mengembangkan diri dan skill?

		// Pendidikan Keluarga
		DelayChildren          *string `gorm:"column:delay_children" json:"delay_children"`                     // Apakah kamu berencana menunda memiliki anak?
		ChildEducationPlan     *string `gorm:"column:child_education_plan" json:"child_education_plan"`         // Apakah kamu sudah punya rencana pendidikan anak?
		ReligiousEmotionalBond *string `gorm:"column:religious_emotional_bond" json:"religious_emotional_bond"` // Bagaimana cara menjaga nilai agama & kedekatan emosional dengan anak?
		ParentingChallenges    *string `gorm:"column:parenting_challenges" json:"parenting_challenges"`         // Saat menghadapi tantangan pengasuhan, bagaimana kamu menyikapinya?

		// Finansial Keluarga
		MonthlyFinance       *string `gorm:"column:monthly_finance" json:"monthly_finance"`             // Bagaimana kamu mengelola keuangan bulanan?
		FamilyResponsibility *string `gorm:"column:family_responsibility" json:"family_responsibility"` // Apakah kamu masih punya tanggungan keluarga setelah menikah?
		DebtStatus           *string `gorm:"column:debt_status" json:"debt_status"`                     // Apakah kamu punya cicilan/utang setelah menikah?
		FinanceSharing       *string `gorm:"column:finance_sharing" json:"finance_sharing"`             // Setelah menikah, bagaimana pembagian tanggung jawab keuangan?
		IncomeGapView        *string `gorm:"column:income_gap_view" json:"income_gap_view"`             // Pandangan kamu jika istri berpenghasilan lebih besar dari suami?

		// Keputusan dan Komunikasi
		DecisionMaking     *string `gorm:"column:decision_making" json:"decision_making"`         // Dalam mengambil keputusan, kamu lebih mempertimbangkan pasangan atau sendiri?
		GrowthTogether     *string `gorm:"column:growth_together" json:"growth_together"`         // Apakah kamu siap berjuang bersama pasangan? Apa saja yang ingin diperjuangkan?
		ParentIntervention *string `gorm:"column:parent_intervention" json:"parent_intervention"` // Sejauh mana orang tua/mertua boleh ikut campur dalam rumah tangga?
		HabitResponse      *string `gorm:"column:habit_response" json:"habit_response"`           // Bagaimana kamu menyikapi kebiasaan pasangan yang kurang kamu sukai?
	}

	GetMarriageReadinessProfileRequest struct {
		AccountID int64 `json:"-"`
	}
)

type (
	SavePartnerCriteriaRequest struct {
		AccountID int64 `json:"account_id"`

		ExpecteMinAgeLimit                   *int            `gorm:"column:expected_min_age_limit" json:"expected_min_age_limit"`                                     // batas usia pasangan yang diharapkan
		ExpecteMaxAgeLimit                   *int            `gorm:"column:expected_max_age_limit" json:"expected_max_age_limit"`                                     // batas usia pasangan yang diharapkan
		ExpectedDomicile                     *string         `gorm:"column:expected_domicile" json:"expected_domicile"`                                               // domisili pasangan yang diharapkan
		AcceptedMaritalStatus                *pq.StringArray `gorm:"column:accepted_marital_status;type:varchar(255)[]" json:"accepted_marital_status"`               // status pernikahan yang diterima
		PartnerFamilyReligion                *string         `gorm:"column:partner_family_religion" json:"partner_family_religion"`                                   // agama yang dianut keluarga pasangan
		PartnerWeeklyReligiousStudyFrequency *string         `gorm:"column:partner_weekly_religious_study_frequency" json:"partner_weekly_religious_study_frequency"` // rata-rata jumlah kajian yang diikuti pasangan per pekan
		PartnerMonthlySpendingEstimate       *string         `gorm:"column:partner_monthly_spending_estimate" json:"partner_monthly_spending_estimate"`               // estimasi pengeluaran pasangan per bulan
		PartnerCanCook                       *string         `gorm:"column:partner_can_cook" json:"partner_can_cook"`                                                 // apakah pasangan diharapkan bisa memasak

		// Kriteria Fisik
		ExpectedBodyShapes     *pq.StringArray `gorm:"column:expected_body_shapes;type:varchar(255)[]" json:"expected_body_shapes"`       // bentuk tubuh yang diharapkan
		ExpectedSkinColors     *pq.StringArray `gorm:"column:expected_skin_colors;type:varchar(255)[]" json:"expected_skin_colors"`       // warna kulit yang diharapkan
		ExpectedHairTypes      *pq.StringArray `gorm:"column:expected_hair_types;type:varchar(255)[]" json:"expected_hair_types"`         // tipe rambut yang diharapkan
		ExpectedHairThickness  *pq.StringArray `gorm:"column:expected_hair_thickness;type:varchar(255)[]" json:"expected_hair_thickness"` // jenis rambut yang diharapkan
		ExpectedMinHeightLimit *int            `gorm:"column:expected_min_height_limit" json:"expected_min_height_limit"`                 // tinggi badan yang diharapkan
		ExpectedMaxHeightLimit *int            `gorm:"column:expected_max_height_limit" json:"expected_max_height_limit"`                 // tinggi badan yang diharapkan

		// Pendidikan & Pekerjaan
		ExpectedPartnerIncome *string         `gorm:"column:expected_partner_income" json:"expected_partner_income"`                     // penghasilan pasangan per bulan yang diharapkan
		ExpectedLastEducation *pq.StringArray `gorm:"column:expected_last_education;type:varchar(255)[]" json:"expected_last_education"` // pendidikan terakhir yang diharapkan

		// NOT USED
		// ExpectedIncomeSources *pq.StringArray `gorm:"column:expected_income_sources;type:varchar(255)[]" json:"expected_income_sources"` // sumber penghasilan pasangan
		// ExpectedJobType       *string         `gorm:"column:expected_job_type" json:"expected_job_type"`                                 // jenis pekerjaan pasangan yang diharapkan

	}

	GetPartnerCriteriaRequest struct {
		AccountID int64 `json:"-"`
	}
)