55 "fmt"
66 "time"
77
8- "github.com/nyaruka/phonenumbers"
9-
108 "github.com/google/uuid"
9+ "github.com/nyaruka/phonenumbers"
1110
1211 "github.com/NdoleStudio/http-sms-manager/pkg/repositories"
1312 "github.com/palantir/stacktrace"
@@ -67,6 +66,25 @@ func (service *PhoneService) Upsert(ctx context.Context, params PhoneUpsertParam
6766
6867 ctxLogger := service .tracer .CtxLogger (service .logger , span )
6968
69+ phone , err := service .repository .Load (ctx , params .UserID , phonenumbers .Format (& params .PhoneNumber , phonenumbers .E164 ))
70+ if stacktrace .GetCode (err ) == repositories .ErrCodeNotFound {
71+ return service .createPhone (ctx , params )
72+ }
73+
74+ phone .FcmToken = & params .FcmToken
75+ if err = service .repository .Save (ctx , phone ); err != nil {
76+ msg := fmt .Sprintf ("cannot update phone with id [%s] and number [%s]" , phone .ID , phone .PhoneNumber )
77+ return nil , service .tracer .WrapErrorSpan (span , stacktrace .Propagate (err , msg ))
78+ }
79+
80+ ctxLogger .Info (fmt .Sprintf ("phone saved with id [%s] in the userRepository" , phone .ID ))
81+ return phone , nil
82+ }
83+
84+ func (service * PhoneService ) createPhone (ctx context.Context , params PhoneUpsertParams ) (* entities.Phone , error ) {
85+ ctx , span := service .tracer .Start (ctx )
86+ defer span .End ()
87+
7088 phone := & entities.Phone {
7189 ID : uuid .New (),
7290 UserID : params .UserID ,
@@ -76,11 +94,10 @@ func (service *PhoneService) Upsert(ctx context.Context, params PhoneUpsertParam
7694 UpdatedAt : time .Now ().UTC (),
7795 }
7896
79- if err := service .repository .Upsert (ctx , phone ); err != nil {
80- msg := fmt .Sprintf ("cannot save phone with id [%s]" , phone .ID )
97+ if err := service .repository .Save (ctx , phone ); err != nil {
98+ msg := fmt .Sprintf ("cannot create phone with id [%s] and number [%s] " , phone .ID , phone . PhoneNumber )
8199 return nil , service .tracer .WrapErrorSpan (span , stacktrace .Propagate (err , msg ))
82100 }
83101
84- ctxLogger .Info (fmt .Sprintf ("phone saved with id [%s] in the userRepository" , phone .ID ))
85102 return phone , nil
86103}
0 commit comments