Skip to content

Commit

Permalink
refactor: add booking status column
Browse files Browse the repository at this point in the history
Extra:
- add booking status enums

Signed-off-by: Kathurima Kimathi <kathurimakimathi415@gmail.com>
  • Loading branch information
KathurimaKimathi committed Nov 8, 2023
1 parent 289d4bd commit 0c2f15b
Show file tree
Hide file tree
Showing 13 changed files with 291 additions and 28 deletions.
7 changes: 7 additions & 0 deletions db/migrations/000023_add_booking_status.down.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
BEGIN;

ALTER TABLE
IF EXISTS "service_booking"
DROP COLUMN IF EXISTS "booking_status";

COMMIT;
7 changes: 7 additions & 0 deletions db/migrations/000023_add_booking_status.up.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
BEGIN;

ALTER TABLE
IF EXISTS "service_booking"
ADD COLUMN IF NOT EXISTS "booking_status" varchar(15);

COMMIT;
3 changes: 2 additions & 1 deletion pkg/mycarehub/application/dto/output.go
Original file line number Diff line number Diff line change
Expand Up @@ -485,7 +485,8 @@ type BookingOutput struct {
OrganisationID string `json:"organisationID"`
ProgramID string `json:"programID"`
VerificationCode string `json:"verificationCode"`
VerificationCodeStatus enums.BookingStatus `json:"verificationCodeStatus"`
VerificationCodeStatus enums.BookingCodeStatus `json:"verificationCodeStatus"`
BookingStatus enums.BookingStatus `json:"bookingStatus"`
}

// BookingPage is the dataclass that models paginated list of bookings
Expand Down
50 changes: 45 additions & 5 deletions pkg/mycarehub/application/enums/booking_code_status.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,58 @@ import (
"strconv"
)

// BookingStatus is the allowed states of a booking's verification code.
// BookingCodeStatus is the allowed states of a booking's verification code.
type BookingCodeStatus string

const (
Verified BookingCodeStatus = "VERIFIED"
UnVerified BookingCodeStatus = "UNVERIFIED"
)

// IsValid returns true if a booking status is valid
func (m BookingCodeStatus) IsValid() bool {
switch m {
case Verified, UnVerified:
return true
}
return false
}

func (m BookingCodeStatus) String() string {
return string(m)
}

// UnmarshalGQL converts the supplied value to a booking type.
func (m *BookingCodeStatus) UnmarshalGQL(v interface{}) error {
str, ok := v.(string)
if !ok {
return fmt.Errorf("enums must be strings")
}

*m = BookingCodeStatus(str)
if !m.IsValid() {
return fmt.Errorf("%s is not a valid BookingCodeStatus", str)
}
return nil
}

// MarshalGQL writes the booking status type to the supplied
func (m BookingCodeStatus) MarshalGQL(w io.Writer) {
fmt.Fprint(w, strconv.Quote(m.String()))
}

// BookingStatus is the allowed states of a booking.
type BookingStatus string

const (
Verified BookingStatus = "VERIFIED"
UnVerified BookingStatus = "UNVERIFIED"
Pending BookingStatus = "PENDING"
Fulfilled BookingStatus = "FULFILLED"
)

// IsValid returns true if a booking status is valid
func (m BookingStatus) IsValid() bool {
switch m {
case Verified, UnVerified:
case Pending, Fulfilled:
return true
}
return false
Expand All @@ -27,7 +67,7 @@ func (m BookingStatus) String() string {
return string(m)
}

// UnmarshalGQL converts the supplied value to a booking type.
// UnmarshalGQL converts the supplied value to a booking status.
func (m *BookingStatus) UnmarshalGQL(v interface{}) error {
str, ok := v.(string)
if !ok {
Expand Down
133 changes: 126 additions & 7 deletions pkg/mycarehub/application/enums/booking_code_status_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@ import (
"testing"
)

func TestBookingStatus_String(t *testing.T) {
func TestBookingCodeStatus_String(t *testing.T) {
tests := []struct {
name string
e BookingStatus
e BookingCodeStatus
want string
}{
{
Expand All @@ -18,6 +18,125 @@ func TestBookingStatus_String(t *testing.T) {
want: "VERIFIED",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := tt.e.String(); got != tt.want {
t.Errorf("BookingCodeStatus.String() = %v, want %v", got, tt.want)
}
})
}
}

func TestBookingCodeStatus_IsValid(t *testing.T) {
tests := []struct {
name string
e BookingCodeStatus
want bool
}{
{
name: "valid type",
e: Verified,
want: true,
},
{
name: "invalid type",
e: BookingCodeStatus("invalid"),
want: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := tt.e.IsValid(); got != tt.want {
t.Errorf("BookingCodeStatus.IsValid() = %v, want %v", got, tt.want)
}
})
}
}

func TestBookingCodeStatus_UnmarshalGQL(t *testing.T) {
value := Verified
invalid := BookingCodeStatus("invalid")
type args struct {
v interface{}
}
tests := []struct {
name string
e *BookingCodeStatus
args args
wantErr bool
}{
{
name: "valid type",
e: &value,
args: args{
v: "VERIFIED",
},
wantErr: false,
},
{
name: "invalid type",
e: &invalid,
args: args{
v: "this is not a valid type",
},
wantErr: true,
},
{
name: "non string type",
e: &invalid,
args: args{
v: 1,
},
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if err := tt.e.UnmarshalGQL(tt.args.v); (err != nil) != tt.wantErr {
t.Errorf("BookingCodeStatus.UnmarshalGQL() error = %v, wantErr %v", err, tt.wantErr)
}
})
}
}

func TestBookingCodeStatus_MarshalGQL(t *testing.T) {
w := &bytes.Buffer{}
tests := []struct {
name string
e BookingCodeStatus
b *bytes.Buffer
wantW string
panic bool
}{
{
name: "valid type enums",
e: Verified,
b: w,
wantW: strconv.Quote("VERIFIED"),
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
tt.e.MarshalGQL(tt.b)
if gotW := w.String(); gotW != tt.wantW {
t.Errorf("BookingCodeStatus.MarshalGQL() = %v, want %v", gotW, tt.wantW)
}
})
}
}

func TestBookingStatus_String(t *testing.T) {
tests := []struct {
name string
e BookingStatus
want string
}{
{
name: "PENDING",
e: Pending,
want: "PENDING",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := tt.e.String(); got != tt.want {
Expand All @@ -35,7 +154,7 @@ func TestBookingStatus_IsValid(t *testing.T) {
}{
{
name: "valid type",
e: Verified,
e: Pending,
want: true,
},
{
Expand All @@ -54,7 +173,7 @@ func TestBookingStatus_IsValid(t *testing.T) {
}

func TestBookingStatus_UnmarshalGQL(t *testing.T) {
value := Verified
value := Pending
invalid := BookingStatus("invalid")
type args struct {
v interface{}
Expand All @@ -69,7 +188,7 @@ func TestBookingStatus_UnmarshalGQL(t *testing.T) {
name: "valid type",
e: &value,
args: args{
v: "VERIFIED",
v: "PENDING",
},
wantErr: false,
},
Expand Down Expand Up @@ -110,9 +229,9 @@ func TestBookingStatus_MarshalGQL(t *testing.T) {
}{
{
name: "valid type enums",
e: Verified,
e: Pending,
b: w,
wantW: strconv.Quote("VERIFIED"),
wantW: strconv.Quote("PENDING"),
},
}
for _, tt := range tests {
Expand Down
21 changes: 11 additions & 10 deletions pkg/mycarehub/domain/booking.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,15 @@ import (

// Booking is the booking class data model
type Booking struct {
ID string `json:"id"`
Active bool `json:"active"`
Services []string `json:"services"`
Date time.Time `json:"date"`
Facility Facility `json:"facility"`
Client ClientProfile `json:"clientProfile"`
OrganisationID string `json:"organisationID"`
ProgramID string `json:"programID"`
VerificationCode string `json:"verificationCode"`
VerificationCodeStatus enums.BookingStatus `json:"verificationCodeStatus"`
ID string `json:"id"`
Active bool `json:"active"`
Services []string `json:"services"`
Date time.Time `json:"date"`
Facility Facility `json:"facility"`
Client ClientProfile `json:"clientProfile"`
OrganisationID string `json:"organisationID"`
ProgramID string `json:"programID"`
VerificationCode string `json:"verificationCode"`
VerificationCodeStatus enums.BookingCodeStatus `json:"verificationCodeStatus"`
BookingStatus enums.BookingStatus `json:"bookingStatus"`
}
Original file line number Diff line number Diff line change
Expand Up @@ -2160,6 +2160,7 @@ type Booking struct {
ProgramID string `gorm:"column:program_id"`
VerificationCode string `gorm:"column:verification_code"`
VerificationCodeStatus string `gorm:"column:verification_code_status"`
BookingStatus string `gorm:"column:booking_status"`

Client Client `gorm:"ForeignKey:client_id;constraint:OnUpdate:CASCADE,OnDelete:CASCADE;not null"`
Facility Facility `gorm:"ForeignKey:facility_id;constraint:OnUpdate:CASCADE,OnDelete:CASCADE;not null"`
Expand Down
3 changes: 2 additions & 1 deletion pkg/mycarehub/infrastructure/database/postgres/pg_create.go
Original file line number Diff line number Diff line change
Expand Up @@ -1367,7 +1367,8 @@ func (d *MyCareHubDb) CreateBooking(ctx context.Context, booking *domain.Booking
Services: serviceIDs,
Date: result.Date,
VerificationCode: result.VerificationCode,
VerificationCodeStatus: enums.BookingStatus(result.VerificationCodeStatus),
VerificationCodeStatus: enums.BookingCodeStatus(result.VerificationCodeStatus),
BookingStatus: enums.BookingStatus(result.BookingStatus),
Facility: domain.Facility{
ID: &result.FacilityID,
},
Expand Down
3 changes: 2 additions & 1 deletion pkg/mycarehub/infrastructure/database/postgres/pg_query.go
Original file line number Diff line number Diff line change
Expand Up @@ -3630,7 +3630,8 @@ func (d *MyCareHubDb) ListBookings(ctx context.Context, clientID string, paginat
OrganisationID: singleBooking.OrganisationID,
ProgramID: singleBooking.ProgramID,
VerificationCode: singleBooking.VerificationCode,
VerificationCodeStatus: enums.BookingStatus(singleBooking.VerificationCodeStatus),
VerificationCodeStatus: enums.BookingCodeStatus(singleBooking.VerificationCodeStatus),
BookingStatus: enums.BookingStatus(singleBooking.BookingStatus),
})
}

Expand Down
5 changes: 5 additions & 0 deletions pkg/mycarehub/presentation/graph/enums.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,11 @@ enum Country {
}

enum BookingStatus {
PENDING
FULFILLED
}

enum BookingCodeStatus {
VERIFIED
UNVERIFIED
}

0 comments on commit 0c2f15b

Please sign in to comment.