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 }