@@ -21,6 +21,7 @@ import (
2121 "github.com/charmbracelet/soft-serve/server/storage"
2222 "github.com/charmbracelet/soft-serve/server/task"
2323 "github.com/charmbracelet/soft-serve/server/utils"
24+ "github.com/charmbracelet/soft-serve/server/webhook"
2425)
2526
2627func (d * Backend ) reposPath () string {
@@ -216,7 +217,20 @@ func (d *Backend) DeleteRepository(ctx context.Context, name string) error {
216217 repo := name + ".git"
217218 rp := filepath .Join (d .reposPath (), repo )
218219
219- err := d .db .TransactionContext (ctx , func (tx * db.Tx ) error {
220+ user := proto .UserFromContext (ctx )
221+ r , err := d .Repository (ctx , name )
222+ if err != nil {
223+ return err
224+ }
225+
226+ // We create the webhook event before deleting the repository so we can
227+ // send the event after deleting the repository.
228+ wh , err := webhook .NewRepositoryEvent (ctx , user , r , webhook .RepositoryEventActionDelete )
229+ if err != nil {
230+ return err
231+ }
232+
233+ if err := d .db .TransactionContext (ctx , func (tx * db.Tx ) error {
220234 // Delete repo from cache
221235 defer d .cache .Delete (name )
222236
@@ -257,17 +271,20 @@ func (d *Backend) DeleteRepository(ctx context.Context, name string) error {
257271 }
258272
259273 return os .RemoveAll (rp )
260- })
261- if errors .Is (err , db .ErrRecordNotFound ) {
262- return proto .ErrRepoNotFound
274+ }); err != nil {
275+ if errors .Is (err , db .ErrRecordNotFound ) {
276+ return proto .ErrRepoNotFound
277+ }
278+
279+ return db .WrapError (err )
263280 }
264281
265- return err
282+ return webhook . SendEvent ( ctx , wh )
266283}
267284
268285// DeleteUserRepositories deletes all user repositories.
269286func (d * Backend ) DeleteUserRepositories (ctx context.Context , username string ) error {
270- return d .db .TransactionContext (ctx , func (tx * db.Tx ) error {
287+ if err := d .db .TransactionContext (ctx , func (tx * db.Tx ) error {
271288 user , err := d .store .FindUserByUsername (ctx , tx , username )
272289 if err != nil {
273290 return err
@@ -285,7 +302,11 @@ func (d *Backend) DeleteUserRepositories(ctx context.Context, username string) e
285302 }
286303
287304 return nil
288- })
305+ }); err != nil {
306+ return db .WrapError (err )
307+ }
308+
309+ return nil
289310}
290311
291312// RenameRepository renames a repository.
@@ -301,6 +322,11 @@ func (d *Backend) RenameRepository(ctx context.Context, oldName string, newName
301322 if err := utils .ValidateRepo (newName ); err != nil {
302323 return err
303324 }
325+
326+ if oldName == newName {
327+ return nil
328+ }
329+
304330 oldRepo := oldName + ".git"
305331 newRepo := newName + ".git"
306332 op := filepath .Join (d .reposPath (), oldRepo )
@@ -331,7 +357,18 @@ func (d *Backend) RenameRepository(ctx context.Context, oldName string, newName
331357 return db .WrapError (err )
332358 }
333359
334- return nil
360+ user := proto .UserFromContext (ctx )
361+ repo , err := d .Repository (ctx , newName )
362+ if err != nil {
363+ return err
364+ }
365+
366+ wh , err := webhook .NewRepositoryEvent (ctx , user , repo , webhook .RepositoryEventActionRename )
367+ if err != nil {
368+ return err
369+ }
370+
371+ return webhook .SendEvent (ctx , wh )
335372}
336373
337374// Repositories returns a list of repositories per page.
@@ -537,7 +574,7 @@ func (d *Backend) SetPrivate(ctx context.Context, name string, private bool) err
537574 // Delete cache
538575 d .cache .Delete (name )
539576
540- return db .WrapError (
577+ if err := db .WrapError (
541578 d .db .TransactionContext (ctx , func (tx * db.Tx ) error {
542579 fp := filepath .Join (rp , "git-daemon-export-ok" )
543580 if ! private {
@@ -556,7 +593,28 @@ func (d *Backend) SetPrivate(ctx context.Context, name string, private bool) err
556593
557594 return d .store .SetRepoIsPrivateByName (ctx , tx , name , private )
558595 }),
559- )
596+ ); err != nil {
597+ return err
598+ }
599+
600+ user := proto .UserFromContext (ctx )
601+ repo , err := d .Repository (ctx , name )
602+ if err != nil {
603+ return err
604+ }
605+
606+ if repo .IsPrivate () != ! private {
607+ wh , err := webhook .NewRepositoryEvent (ctx , user , repo , webhook .RepositoryEventActionVisibilityChange )
608+ if err != nil {
609+ return err
610+ }
611+
612+ if err := webhook .SendEvent (ctx , wh ); err != nil {
613+ return err
614+ }
615+ }
616+
617+ return nil
560618}
561619
562620// SetProjectName sets the project name of a repository.
@@ -651,6 +709,11 @@ func (r *repo) IsHidden() bool {
651709 return r .repo .Hidden
652710}
653711
712+ // CreatedAt returns the repository's creation time.
713+ func (r * repo ) CreatedAt () time.Time {
714+ return r .repo .CreatedAt
715+ }
716+
654717// UpdatedAt returns the repository's last update time.
655718func (r * repo ) UpdatedAt () time.Time {
656719 // Try to read the last modified time from the info directory.
0 commit comments