handle-event-types.go raw

   1  package app
   2  
   3  import (
   4  	"next.orly.dev/pkg/nostr/encoders/envelopes/eventenvelope"
   5  	"next.orly.dev/pkg/nostr/encoders/envelopes/okenvelope"
   6  	"next.orly.dev/pkg/nostr/encoders/reason"
   7  	"next.orly.dev/pkg/event/authorization"
   8  	"next.orly.dev/pkg/event/routing"
   9  	"next.orly.dev/pkg/event/validation"
  10  )
  11  
  12  // sendValidationError sends an appropriate OK response for a validation failure.
  13  func (l *Listener) sendValidationError(env eventenvelope.I, result validation.Result) error {
  14  	var r []byte
  15  	switch result.Code {
  16  	case validation.ReasonBlocked:
  17  		r = reason.Blocked.F(result.Msg)
  18  	case validation.ReasonInvalid:
  19  		r = reason.Invalid.F(result.Msg)
  20  	case validation.ReasonError:
  21  		r = reason.Error.F(result.Msg)
  22  	default:
  23  		r = reason.Error.F(result.Msg)
  24  	}
  25  	return okenvelope.NewFrom(env.Id(), false, r).Write(l)
  26  }
  27  
  28  // sendAuthorizationDenied sends an appropriate OK response for an authorization denial.
  29  func (l *Listener) sendAuthorizationDenied(env eventenvelope.I, decision authorization.Decision) error {
  30  	var r []byte
  31  	if decision.RequireAuth {
  32  		r = reason.AuthRequired.F(decision.DenyReason)
  33  	} else {
  34  		r = reason.Blocked.F(decision.DenyReason)
  35  	}
  36  	return okenvelope.NewFrom(env.Id(), false, r).Write(l)
  37  }
  38  
  39  // sendRoutingError sends an appropriate OK response for a routing error.
  40  func (l *Listener) sendRoutingError(env eventenvelope.I, result routing.Result) error {
  41  	if result.Error != nil {
  42  		return okenvelope.NewFrom(env.Id(), false, reason.Error.F(result.Error.Error())).Write(l)
  43  	}
  44  	return nil
  45  }
  46  
  47  // sendProcessingError sends an appropriate OK response for a processing failure.
  48  func (l *Listener) sendProcessingError(env eventenvelope.I, msg string) error {
  49  	return okenvelope.NewFrom(env.Id(), false, reason.Error.F(msg)).Write(l)
  50  }
  51  
  52  // sendProcessingBlocked sends an appropriate OK response for a blocked event.
  53  func (l *Listener) sendProcessingBlocked(env eventenvelope.I, msg string) error {
  54  	return okenvelope.NewFrom(env.Id(), false, reason.Blocked.F(msg)).Write(l)
  55  }
  56  
  57  // sendRawValidationError sends an OK response for raw JSON validation failure (before unmarshal).
  58  // Since we don't have an event ID at this point, we pass nil.
  59  func (l *Listener) sendRawValidationError(result validation.Result) error {
  60  	var r []byte
  61  	switch result.Code {
  62  	case validation.ReasonBlocked:
  63  		r = reason.Blocked.F(result.Msg)
  64  	case validation.ReasonInvalid:
  65  		r = reason.Invalid.F(result.Msg)
  66  	case validation.ReasonError:
  67  		r = reason.Error.F(result.Msg)
  68  	default:
  69  		r = reason.Error.F(result.Msg)
  70  	}
  71  	return okenvelope.NewFrom(nil, false, r).Write(l)
  72  }
  73