issue-205: added comments for menu handlers methods. #218

Open
konstantinmds wants to merge 1 commits from konstantinmds/ussd:dev/issue-205 into master

View File

@ -80,6 +80,7 @@ type Handlers struct {
profile *models.Profile
}
// NewHandlers creates a new instance of the Handlers struct with the provided dependencies.
Outdated
Review

In godoc, first word in the description of an exported symbol should be the symbol name, e.g. "NewHandlers creates a ..."

In godoc, first word in the description of an exported symbol should be the symbol name, e.g. "NewHandlers creates a ..."
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
Review

@carlos is this correct, as it is only for blocked numbers? If so maybe this should be renamed to reflect this.

@carlos is this correct, as it is only for blocked numbers? If so maybe this should be renamed to reflect this.
Review

@lash Yeah that's correct. The CheckPinMisMatch checks the temporary PIN(unconfirmed PIN) when trying to reset a blocked number's PIN.

@lash Yeah that's correct. The `CheckPinMisMatch` checks the temporary PIN(unconfirmed PIN) when trying to reset a blocked number's PIN.
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
Review

Can this be more precise please?

Can this be more precise please?
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
Review

function name is not needed for unexported symbols.

function name is not needed for unexported symbols.
func (h *Handlers) insertProfileItems(ctx context.Context, sessionId string, res *resource.Result) error {
var err error
store := h.userdataStore