eintopf.info@v0.13.16/service/event/operator.go (about)

     1  // Copyright (C) 2022 The Eintopf authors
     2  //
     3  // This program is free software: you can redistribute it and/or modify
     4  // it under the terms of the GNU Affero General Public License as
     5  // published by the Free Software Foundation, either version 3 of the
     6  // License, or (at your option) any later version.
     7  //
     8  // This program is distributed in the hope that it will be useful,
     9  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    10  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    11  // GNU Affero General Public License for more details.
    12  //
    13  // You should have received a copy of the GNU Affero General Public License
    14  // along with this program.  If not, see <https://www.gnu.org/licenses/>.
    15  
    16  package event
    17  
    18  import (
    19  	"context"
    20  	"strings"
    21  
    22  	"eintopf.info/internal/crud"
    23  	"eintopf.info/service/auth"
    24  	"eintopf.info/service/oqueue"
    25  )
    26  
    27  type Operator struct {
    28  	storer Storer
    29  	queue  oqueue.Service
    30  }
    31  
    32  func NewOperator(storer Storer, queue oqueue.Service) *Operator {
    33  	return &Operator{storer: storer, queue: queue}
    34  }
    35  
    36  type CreateOperation struct {
    37  	Event  *Event
    38  	userID string
    39  }
    40  
    41  func NewCreateOperation(event *Event, userID string) CreateOperation {
    42  	return CreateOperation{event, userID}
    43  }
    44  
    45  func (o CreateOperation) UserID() string {
    46  	return o.userID
    47  }
    48  
    49  func (i *Operator) Create(ctx context.Context, newEvent *NewEvent) (*Event, error) {
    50  	event, err := i.storer.Create(ctx, newEvent)
    51  	if err != nil {
    52  		return event, err
    53  	}
    54  	if event == nil {
    55  		return nil, nil
    56  	}
    57  
    58  	userID, err := auth.UserIDFromContext(ctx)
    59  	if err != nil {
    60  		return nil, err
    61  	}
    62  	i.queue.AddOperation(CreateOperation{
    63  		Event:  event,
    64  		userID: userID,
    65  	})
    66  
    67  	if event.Parent != "" {
    68  		parentID := strings.TrimPrefix(event.Parent, "id:")
    69  		parentEvent, err := i.storer.FindByID(auth.ContextWithRole(ctx, auth.RoleInternal), parentID)
    70  		if err == nil && parentEvent != nil {
    71  			i.queue.AddOperation(CreateOperation{
    72  				Event:  parentEvent,
    73  				userID: userID,
    74  			})
    75  		}
    76  	}
    77  
    78  	return event, nil
    79  }
    80  
    81  type UpdateOperation struct {
    82  	Event  *Event
    83  	userID string
    84  }
    85  
    86  func NewUpdateOperation(event *Event, userID string) UpdateOperation {
    87  	return UpdateOperation{event, userID}
    88  }
    89  
    90  func (o UpdateOperation) UserID() string {
    91  	return o.userID
    92  }
    93  
    94  func (i *Operator) Update(ctx context.Context, event *Event) (*Event, error) {
    95  	event, err := i.storer.Update(ctx, event)
    96  	if err != nil {
    97  		return event, err
    98  	}
    99  	if event == nil {
   100  		return nil, nil
   101  	}
   102  
   103  	userID, err := auth.UserIDFromContext(ctx)
   104  	if err != nil {
   105  		return nil, err
   106  	}
   107  	i.queue.AddOperation(UpdateOperation{
   108  		Event:  event,
   109  		userID: userID,
   110  	})
   111  
   112  	if event.Parent != "" {
   113  		parentID := strings.TrimPrefix(event.Parent, "id:")
   114  		parentEvent, err := i.storer.FindByID(auth.ContextWithRole(ctx, auth.RoleInternal), parentID)
   115  		if err == nil && parentEvent != nil {
   116  			i.queue.AddOperation(UpdateOperation{
   117  				Event:  parentEvent,
   118  				userID: userID,
   119  			})
   120  		}
   121  	}
   122  
   123  	return event, nil
   124  }
   125  
   126  type DeleteOperation struct {
   127  	ID     string
   128  	userID string
   129  }
   130  
   131  func NewDeleteOperation(id string, userID string) DeleteOperation {
   132  	return DeleteOperation{id, userID}
   133  }
   134  
   135  func (o DeleteOperation) UserID() string {
   136  	return o.userID
   137  }
   138  
   139  func (i *Operator) Delete(ctx context.Context, id string) error {
   140  	event, err := i.storer.FindByID(ctx, id)
   141  	if err != nil {
   142  		return nil
   143  	}
   144  
   145  	err = i.storer.Delete(ctx, id)
   146  	if err != nil {
   147  		return err
   148  	}
   149  
   150  	userID, err := auth.UserIDFromContext(ctx)
   151  	if err != nil {
   152  		return err
   153  	}
   154  	i.queue.AddOperation(DeleteOperation{
   155  		ID:     id,
   156  		userID: userID,
   157  	})
   158  
   159  	if event != nil && event.Parent != "" {
   160  		parentID := strings.TrimPrefix(event.Parent, "id:")
   161  		parentEvent, err := i.storer.FindByID(auth.ContextWithRole(ctx, auth.RoleInternal), parentID)
   162  		if err == nil && parentEvent != nil {
   163  			i.queue.AddOperation(UpdateOperation{
   164  				Event:  parentEvent,
   165  				userID: userID,
   166  			})
   167  		}
   168  	}
   169  
   170  	return nil
   171  }
   172  
   173  func (i *Operator) FindByID(ctx context.Context, id string) (*Event, error) {
   174  	return i.storer.FindByID(ctx, id)
   175  }
   176  
   177  func (i *Operator) Find(ctx context.Context, params *crud.FindParams[FindFilters]) ([]*Event, int, error) {
   178  	return i.storer.Find(ctx, params)
   179  }