diff --git a/server/datastore/mysql/packs.go b/server/datastore/mysql/packs.go index 2c5cc35d0e..3a7caa8ceb 100644 --- a/server/datastore/mysql/packs.go +++ b/server/datastore/mysql/packs.go @@ -28,14 +28,34 @@ func (d *Datastore) PackByName(name string) (*kolide.Pack, bool, error) { // NewPack creates a new Pack func (d *Datastore) NewPack(pack *kolide.Pack) (*kolide.Pack, error) { + var ( + deletedPack kolide.Pack + query string + ) + err := d.db.Get(&deletedPack, + "SELECT * FROM packs WHERE name = ? AND deleted", pack.Name) + switch err { + case nil: + query = ` + REPLACE INTO packs + ( name, description, platform, created_by, disabled, deleted) + VALUES ( ?, ?, ?, ?, ?, ?) + ` + case sql.ErrNoRows: + query = ` + INSERT INTO packs + ( name, description, platform, created_by, disabled, deleted) + VALUES ( ?, ?, ?, ?, ?, ?) + ` + default: + return nil, errors.Wrap(err, "check for existing pack") + } - query := ` - INSERT INTO packs ( name, description, platform, created_by, disabled ) - VALUES ( ?, ?, ?, ?, ?) - ` - - result, err := d.db.Exec(query, pack.Name, pack.Description, pack.Platform, pack.CreatedBy, pack.Disabled) - if err != nil { + deleted := false + result, err := d.db.Exec(query, pack.Name, pack.Description, pack.Platform, pack.CreatedBy, pack.Disabled, deleted) + if err != nil && isDuplicate(err) { + return nil, alreadyExists("Pack", deletedPack.ID) + } else if err != nil { return nil, errors.Wrap(err, "creating new pack") } diff --git a/server/service/endpoint_packs.go b/server/service/endpoint_packs.go index a2c225a494..b00e371b88 100644 --- a/server/service/endpoint_packs.go +++ b/server/service/endpoint_packs.go @@ -103,12 +103,12 @@ func makeListPacksEndpoint(svc kolide.Service) endpoint.Endpoint { } resp := listPacksResponse{Packs: make([]packResponse, len(packs), len(packs))} - for _, pack := range packs { + for i, pack := range packs { packResp, err := packResponseForPack(ctx, svc, *pack) if err != nil { return getPackResponse{Err: err}, nil } - resp.Packs = append(resp.Packs, *packResp) + resp.Packs[i] = *packResp } return resp, nil }