Upsert a new entities.Phone
(ctx context.Context, params *PhoneUpsertParams)
| 112 | |
| 113 | // Upsert a new entities.Phone |
| 114 | func (service *PhoneService) Upsert(ctx context.Context, params *PhoneUpsertParams) (*entities.Phone, error) { |
| 115 | ctx, span := service.tracer.Start(ctx) |
| 116 | defer span.End() |
| 117 | |
| 118 | ctxLogger := service.tracer.CtxLogger(service.logger, span) |
| 119 | |
| 120 | phone, err := service.repository.Load(ctx, params.UserID, phonenumbers.Format(params.PhoneNumber, phonenumbers.E164)) |
| 121 | if stacktrace.GetCode(err) == repositories.ErrCodeNotFound { |
| 122 | return service.createPhone(ctx, &PhoneFCMTokenParams{ |
| 123 | Source: params.Source, |
| 124 | PhoneNumber: params.PhoneNumber, |
| 125 | PhoneAPIKeyID: nil, |
| 126 | UserID: params.UserID, |
| 127 | FcmToken: params.FcmToken, |
| 128 | SIM: params.SIM, |
| 129 | MessageSendScheduleID: params.MessageSendScheduleID, |
| 130 | }) |
| 131 | } |
| 132 | |
| 133 | if err != nil { |
| 134 | msg := fmt.Sprintf("cannot upsert phone with id [%s] and number [%s]", phone.ID, phone.PhoneNumber) |
| 135 | return nil, service.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg)) |
| 136 | } |
| 137 | |
| 138 | if err = service.repository.Save(ctx, service.update(phone, params)); err != nil { |
| 139 | msg := fmt.Sprintf("cannot update phone with id [%s] and number [%s]", phone.ID, phone.PhoneNumber) |
| 140 | return nil, service.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg)) |
| 141 | } |
| 142 | |
| 143 | ctxLogger.Info(fmt.Sprintf("phone updated with id [%s] in the phone repository for user [%s]", phone.ID, phone.UserID)) |
| 144 | return phone, service.dispatchPhoneUpdatedEvent(ctx, phone, &PhoneFCMTokenParams{ |
| 145 | Source: params.Source, |
| 146 | PhoneNumber: params.PhoneNumber, |
| 147 | PhoneAPIKeyID: nil, |
| 148 | UserID: params.UserID, |
| 149 | FcmToken: params.FcmToken, |
| 150 | SIM: params.SIM, |
| 151 | MessageSendScheduleID: params.MessageSendScheduleID, |
| 152 | }) |
| 153 | } |
| 154 | |
| 155 | func (service *PhoneService) dispatchPhoneUpdatedEvent(ctx context.Context, phone *entities.Phone, input *PhoneFCMTokenParams) error { |
| 156 | ctx, span := service.tracer.Start(ctx) |