Compare commits
	
		
			1 Commits
		
	
	
		
			21b24e0dbb
			...
			d946dfc577
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| d946dfc577 | 
@ -80,6 +80,7 @@ type Handlers struct {
 | 
			
		||||
	profile        *models.Profile
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewHandlers creates a new instance of the Handlers struct with the provided dependencies.
 | 
			
		||||
func NewHandlers(appFlags *asm.FlagParser, userdataStore db.Db, adminstore *utils.AdminStore, accountService remote.AccountServiceInterface) (*Handlers, error) {
 | 
			
		||||
	if userdataStore == nil {
 | 
			
		||||
		return nil, fmt.Errorf("cannot create handler with nil userdata store")
 | 
			
		||||
@ -103,6 +104,7 @@ func NewHandlers(appFlags *asm.FlagParser, userdataStore db.Db, adminstore *util
 | 
			
		||||
	return h, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WithPersister sets persister instance to the handlers
 | 
			
		||||
func (h *Handlers) WithPersister(pe *persist.Persister) *Handlers {
 | 
			
		||||
	if h.pe != nil {
 | 
			
		||||
		panic("persister already set")
 | 
			
		||||
@ -111,6 +113,7 @@ func (h *Handlers) WithPersister(pe *persist.Persister) *Handlers {
 | 
			
		||||
	return h
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Init initializes the handler for a new session
 | 
			
		||||
func (h *Handlers) Init(ctx context.Context, sym string, input []byte) (resource.Result, error) {
 | 
			
		||||
	var r resource.Result
 | 
			
		||||
	if h.pe == nil {
 | 
			
		||||
@ -173,6 +176,7 @@ func (h *Handlers) SetLanguage(ctx context.Context, sym string, input []byte) (r
 | 
			
		||||
	return res, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// createAccountNoExist handles the account creation when no existing account is present for the session and stores associated data in the user data store.
 | 
			
		||||
func (h *Handlers) createAccountNoExist(ctx context.Context, sessionId string, res *resource.Result) error {
 | 
			
		||||
	flag_account_created, _ := h.flagManager.GetFlag("flag_account_created")
 | 
			
		||||
	r, err := h.accountService.CreateAccount(ctx)
 | 
			
		||||
@ -231,6 +235,7 @@ func (h *Handlers) CreateAccount(ctx context.Context, sym string, input []byte)
 | 
			
		||||
	return res, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CheckPinMisMatch checks if the provided PIN matches a temporary PIN stored for a blocked number
 | 
			
		||||
func (h *Handlers) CheckPinMisMatch(ctx context.Context, sym string, input []byte) (resource.Result, error) {
 | 
			
		||||
	res := resource.Result{}
 | 
			
		||||
	flag_pin_mismatch, _ := h.flagManager.GetFlag("flag_pin_mismatch")
 | 
			
		||||
@ -238,12 +243,14 @@ func (h *Handlers) CheckPinMisMatch(ctx context.Context, sym string, input []byt
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return res, fmt.Errorf("missing session")
 | 
			
		||||
	}
 | 
			
		||||
	// Get blocked number from storage
 | 
			
		||||
	store := h.userdataStore
 | 
			
		||||
	blockedNumber, err := store.ReadEntry(ctx, sessionId, common.DATA_BLOCKED_NUMBER)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		logg.ErrorCtxf(ctx, "failed to read blockedNumber entry with", "key", common.DATA_BLOCKED_NUMBER, "error", err)
 | 
			
		||||
		return res, err
 | 
			
		||||
	}
 | 
			
		||||
	// Get temporary PIN for the blocked number
 | 
			
		||||
	temporaryPin, err := store.ReadEntry(ctx, string(blockedNumber), common.DATA_TEMPORARY_VALUE)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		logg.ErrorCtxf(ctx, "failed to read temporaryPin entry with", "key", common.DATA_TEMPORARY_VALUE, "error", err)
 | 
			
		||||
@ -257,6 +264,7 @@ func (h *Handlers) CheckPinMisMatch(ctx context.Context, sym string, input []byt
 | 
			
		||||
	return res, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// VerifyNewPin checks if a new PIN meets the required format criteria
 | 
			
		||||
func (h *Handlers) VerifyNewPin(ctx context.Context, sym string, input []byte) (resource.Result, error) {
 | 
			
		||||
	res := resource.Result{}
 | 
			
		||||
	_, ok := ctx.Value("SessionId").(string)
 | 
			
		||||
@ -306,6 +314,7 @@ func (h *Handlers) SaveTemporaryPin(ctx context.Context, sym string, input []byt
 | 
			
		||||
	return res, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SaveOthersTemporaryPin allows authorized users to set temporary PINs for blocked numbers
 | 
			
		||||
func (h *Handlers) SaveOthersTemporaryPin(ctx context.Context, sym string, input []byte) (resource.Result, error) {
 | 
			
		||||
	var res resource.Result
 | 
			
		||||
	var err error
 | 
			
		||||
@ -316,12 +325,14 @@ func (h *Handlers) SaveOthersTemporaryPin(ctx context.Context, sym string, input
 | 
			
		||||
		return res, fmt.Errorf("missing session")
 | 
			
		||||
	}
 | 
			
		||||
	temporaryPin := string(input)
 | 
			
		||||
	// First, we retrieve the blocked number associated with this session
 | 
			
		||||
	blockedNumber, err := store.ReadEntry(ctx, sessionId, common.DATA_BLOCKED_NUMBER)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		logg.ErrorCtxf(ctx, "failed to read blockedNumber entry with", "key", common.DATA_BLOCKED_NUMBER, "error", err)
 | 
			
		||||
		return res, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Then we save the temporary PIN for that blocked number
 | 
			
		||||
	err = store.WriteEntry(ctx, string(blockedNumber), common.DATA_TEMPORARY_VALUE, []byte(temporaryPin))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		logg.ErrorCtxf(ctx, "failed to write temporaryPin entry with", "key", common.DATA_TEMPORARY_VALUE, "value", temporaryPin, "error", err)
 | 
			
		||||
@ -331,6 +342,7 @@ func (h *Handlers) SaveOthersTemporaryPin(ctx context.Context, sym string, input
 | 
			
		||||
	return res, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ConfirmPinChange validates user's new PIN. If input matches the temporary PIN, saves it as the new account PIN
 | 
			
		||||
func (h *Handlers) ConfirmPinChange(ctx context.Context, sym string, input []byte) (resource.Result, error) {
 | 
			
		||||
	var res resource.Result
 | 
			
		||||
	sessionId, ok := ctx.Value("SessionId").(string)
 | 
			
		||||
@ -350,6 +362,7 @@ func (h *Handlers) ConfirmPinChange(ctx context.Context, sym string, input []byt
 | 
			
		||||
	} else {
 | 
			
		||||
		res.FlagSet = append(res.FlagSet, flag_pin_mismatch)
 | 
			
		||||
	}
 | 
			
		||||
	// If matched, save the confirmed PIN as the new account PIN
 | 
			
		||||
	err = store.WriteEntry(ctx, sessionId, common.DATA_ACCOUNT_PIN, []byte(temporaryPin))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		logg.ErrorCtxf(ctx, "failed to write temporaryPin entry with", "key", common.DATA_ACCOUNT_PIN, "value", temporaryPin, "error", err)
 | 
			
		||||
@ -894,9 +907,12 @@ func (h *Handlers) CheckBalance(ctx context.Context, sym string, input []byte) (
 | 
			
		||||
	return res, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FetchCommunityBalance retrieves and displays the balance for community accounts in user's preferred language
 | 
			
		||||
func (h *Handlers) FetchCommunityBalance(ctx context.Context, sym string, input []byte) (resource.Result, error) {
 | 
			
		||||
	var res resource.Result
 | 
			
		||||
	// retrieve the language code from the context
 | 
			
		||||
	code := codeFromCtx(ctx)
 | 
			
		||||
	// Initialize the localization system with the appropriate translation directory
 | 
			
		||||
	l := gotext.NewLocale(translationDir, code)
 | 
			
		||||
	l.AddDomain("default")
 | 
			
		||||
	//TODO:
 | 
			
		||||
@ -905,6 +921,10 @@ func (h *Handlers) FetchCommunityBalance(ctx context.Context, sym string, input
 | 
			
		||||
	return res, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ResetOthersPin handles the PIN reset process for other users' accounts by:
 | 
			
		||||
// 1. Retrieving the blocked phone number from the session
 | 
			
		||||
// 2. Fetching the temporary PIN associated with that number
 | 
			
		||||
// 3. Updating the account PIN with the temporary PIN
 | 
			
		||||
func (h *Handlers) ResetOthersPin(ctx context.Context, sym string, input []byte) (resource.Result, error) {
 | 
			
		||||
	var res resource.Result
 | 
			
		||||
	store := h.userdataStore
 | 
			
		||||
@ -930,6 +950,7 @@ func (h *Handlers) ResetOthersPin(ctx context.Context, sym string, input []byte)
 | 
			
		||||
	return res, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ResetUnregisteredNumber handles the cleanup of unregistered number flags in the system
 | 
			
		||||
func (h *Handlers) ResetUnregisteredNumber(ctx context.Context, sym string, input []byte) (resource.Result, error) {
 | 
			
		||||
	var res resource.Result
 | 
			
		||||
	flag_unregistered_number, _ := h.flagManager.GetFlag("flag_unregistered_number")
 | 
			
		||||
@ -937,6 +958,8 @@ func (h *Handlers) ResetUnregisteredNumber(ctx context.Context, sym string, inpu
 | 
			
		||||
	return res, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ValidateBlockedNumber performs validation of phone numbers, specifically for blocked numbers in the system.
 | 
			
		||||
// It checks phone number format and verifies registration status
 | 
			
		||||
func (h *Handlers) ValidateBlockedNumber(ctx context.Context, sym string, input []byte) (resource.Result, error) {
 | 
			
		||||
	var res resource.Result
 | 
			
		||||
	var err error
 | 
			
		||||
@ -1336,6 +1359,8 @@ func (h *Handlers) InitiateTransaction(ctx context.Context, sym string, input []
 | 
			
		||||
	return res, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetCurrentProfileInfo retrieves specific profile fields based on the current state of the USSD session.
 | 
			
		||||
// Uses flag management system to track profile field status and handle menu navigation
 | 
			
		||||
func (h *Handlers) GetCurrentProfileInfo(ctx context.Context, sym string, input []byte) (resource.Result, error) {
 | 
			
		||||
	var res resource.Result
 | 
			
		||||
	var profileInfo []byte
 | 
			
		||||
@ -1355,6 +1380,7 @@ func (h *Handlers) GetCurrentProfileInfo(ctx context.Context, sym string, input
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return res, fmt.Errorf("missing session")
 | 
			
		||||
	}
 | 
			
		||||
	// Extract the field name from the state machine position
 | 
			
		||||
	sm, _ := h.st.Where()
 | 
			
		||||
	parts := strings.SplitN(sm, "_", 2)
 | 
			
		||||
	filename := parts[1]
 | 
			
		||||
@ -1447,6 +1473,7 @@ func (h *Handlers) GetCurrentProfileInfo(ctx context.Context, sym string, input
 | 
			
		||||
	return res, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetProfileInfo provides a comprehensive view of a user's profile
 | 
			
		||||
func (h *Handlers) GetProfileInfo(ctx context.Context, sym string, input []byte) (resource.Result, error) {
 | 
			
		||||
	var res resource.Result
 | 
			
		||||
	var defaultValue string
 | 
			
		||||
@ -1957,6 +1984,7 @@ func (h *Handlers) ViewTransactionStatement(ctx context.Context, sym string, inp
 | 
			
		||||
	return res, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// insertProfileItems handles bulk updates of profile information
 | 
			
		||||
func (h *Handlers) insertProfileItems(ctx context.Context, sessionId string, res *resource.Result) error {
 | 
			
		||||
	var err error
 | 
			
		||||
	store := h.userdataStore
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user