github.com/machinefi/w3bstream@v1.6.5-rc9.0.20240426031326-b8c7c4876e72/cmd/srv-applet-mgr/apis/event/pos.go (about)

     1  package event
     2  
     3  import (
     4  	"context"
     5  	"encoding/json"
     6  
     7  	"github.com/machinefi/w3bstream/cmd/srv-applet-mgr/apis/middleware"
     8  	"github.com/machinefi/w3bstream/pkg/depends/kit/httptransport/httpx"
     9  	"github.com/machinefi/w3bstream/pkg/depends/kit/logr"
    10  	"github.com/machinefi/w3bstream/pkg/enums"
    11  	"github.com/machinefi/w3bstream/pkg/errors/status"
    12  	"github.com/machinefi/w3bstream/pkg/modules/event"
    13  	"github.com/machinefi/w3bstream/pkg/modules/project"
    14  	"github.com/machinefi/w3bstream/pkg/types"
    15  )
    16  
    17  type HandleEvent struct {
    18  	httpx.MethodPost
    19  	event.EventReq
    20  }
    21  
    22  func (r *HandleEvent) Path() string {
    23  	return "/:channel"
    24  }
    25  
    26  func (r *HandleEvent) Output(ctx context.Context) (interface{}, error) {
    27  	ctx, l := logr.Start(ctx, "api.HandleEvent")
    28  	defer l.End()
    29  
    30  	r.EventReq.SetDefault()
    31  
    32  	prj, err := project.GetByName(ctx, r.Channel)
    33  	if err != nil {
    34  		return nil, err
    35  	}
    36  	ctx = types.WithProject(ctx, prj)
    37  
    38  	if r.IsDataPush() {
    39  		l.Info("event push")
    40  		// require account auth
    41  		ca, ok := middleware.CurrentAccountFromContext(ctx)
    42  		if !ok {
    43  			return nil, status.InvalidDataPushShouldAccount
    44  		}
    45  		ctx = ca.WithAccount(ctx)
    46  		if ca.Role != enums.ACCOUNT_ROLE__ADMIN && ca.AccountID != prj.AccountID {
    47  			return nil, status.NoProjectPermission.StatusErr().
    48  				WithDesc("data push request should have account permission")
    49  		}
    50  		reqs := event.DataPushReqs{}
    51  		err = json.Unmarshal(r.Payload.Bytes(), &reqs)
    52  		if err != nil {
    53  			return nil, status.InvalidDataPushPayload.StatusErr().WithDesc(err.Error())
    54  		}
    55  		reqs.SetDefault()
    56  		return event.BatchCreate(ctx, reqs)
    57  	}
    58  
    59  	// require publisher auth
    60  	l.Info("event request")
    61  	pub, ok := middleware.MaybePublisher(ctx)
    62  	if !ok {
    63  		return nil, status.InvalidDataPushShouldPublisher
    64  	}
    65  	if pub.ProjectID != prj.ProjectID {
    66  		return nil, status.NoProjectPermission.StatusErr().
    67  			WithDesc("publisher request should have project permission")
    68  	}
    69  	ctx = types.WithPublisher(ctx, pub.Publisher)
    70  	return event.Create(ctx, &r.EventReq)
    71  }