2025-07-25 14:40:04 +02:00
2025-07-25 14:40:04 +02:00
2025-07-06 14:27:59 +02:00
2025-06-23 21:03:52 +02:00
2025-06-23 21:03:52 +02:00
2025-06-23 21:03:52 +02:00
2025-06-23 21:03:52 +02:00
2025-06-23 21:03:52 +02:00
2025-06-23 21:03:52 +02:00
2025-06-23 21:03:52 +02:00
2025-06-23 21:13:08 +02:00

Server Events

How To

In this Example i use the generic-di package to Inject a Service into a Event. First you have to create some Event Handler and/or Effects that was fired when a Event happens. Then you give the Effects and the EventHandlers to a Registration to serve it.

services/external_service.go

package services

import (
  di "git.apihub24.de/admin/generic-di"
)

func init() {
  di.Injectable(newExternalService)
}

// this Service is only a Example to show how to use a real world authentication service!
type IExternalService interface {
  CheckLogin(string, string) bool
}

type externalService struct {}

func newExternalService() IExternalService {
  return &externalService{}
}

func (service *externalService) CheckLogin(name, password string) bool {
  return len(name) > 0 && len(password) > 0
}

events/login_event.go

package events

import (

  di "git.apihub24.de/admin/generic-di"
)

// a Struct of the Login success EventData
type UserLogin struct {
	UserName string `json:"userName"`
}

// a Struct of the Login EventData
type LoginData struct {
	Login    string `json:"login"`
	Password string `json:"password"`
}

type LoginEvent struct {
  someExternalService services.IExternalService
}

func NewLoginEvent() *LoginEvent {
  return &LoginEvent{
    someExternalService: di.Inject[services.IExternalService]()
  }
}

// implement a Method to get the EventName String
func (event *LoginEvent) GetEventName() string {
	return "login"
}

// implement a Method to check if the Event can Execute
func (event *LoginEvent) CanExecute(ctx *serverevents.Context) bool {
	return true
}

// implement a Method to send non Authorized Response
func (event *UserLoginEvent) SendNotAuthorizedResponse(ctx *serverevents.Context) {
}

// implement a Method to Handle a Event
func (event *UserLoginEvent) Handle(ctx *serverevents.Context) {
  data, dataParseErr := serverevents.GetEventData[LoginData](ctx)
	if dataParseErr != nil {
		ctx.Send(http.StatusInternalServerError, "text/plain", []byte(dataParseErr.Error()))
		return
	}

  if !event.someExternalService.CheckLogin(data.Login, data.Password) {
    // send a new Event to the Client
    ctx.Emit(serverevents.Event{
			Type: "login fail",
			Data: "login fails!",
		})
		return
  }

  ctx.Emit(serverevents.Event{
    Type: "login success",
    Data: UserLogin{
			UserName: "some Username",
		},
  })
}

effects/login_success_effect.go

package effects

type LoginSuccessEffect struct {}

func NewLoginSuccessEffect() *LoginSuccessEffect {
  return &LoginSuccessEffect{}
}

// implement a Method that gives the Name of the Event to listen
func (effect *LoginSuccessEffect) OnEvent() string {
  return "login success"
}

// implement a Method to Handle the Effect triggered
func (effect *LoginSuccessEffect) Execute(ctx *serverevents.Context) {
  // do something on login success here...
}

main.go

package main

import (
  serverevents "git.apihub24.de/admin/server_events"
)

func main() {
  port := ":8080"

  serverevents.RegisterEvents([]serverevents.EventHandler{
		events.NewLoginEvent(),
	}, []serverevents.Effect{
		effects.NewLoginSuccessEffect(),
	}, nil)

  log.Default().Printf("Start Server at Port %s", port)
	err := http.ListenAndServe(port, nil)
	if err != nil {
		log.Fatalf("Error on start Server: %v", err)
	}
}
Description
No description provided
Readme 66 KiB
Languages
Go 100%