| 782 | } |
| 783 | |
| 784 | func (ds *SQLStore) InsertTrigger(ctx context.Context, newTrigger *models.Trigger) (*models.Trigger, error) { |
| 785 | |
| 786 | trigger := newTrigger.Clone() |
| 787 | |
| 788 | trigger.CreatedAt = common.DateTime(time.Now()) |
| 789 | trigger.UpdatedAt = trigger.CreatedAt |
| 790 | trigger.ID = id.New().String() |
| 791 | |
| 792 | err := trigger.Validate() |
| 793 | if err != nil { |
| 794 | return nil, err |
| 795 | } |
| 796 | |
| 797 | err = ds.Tx(func(tx *sqlx.Tx) error { |
| 798 | query := tx.Rebind(`SELECT 1 FROM apps WHERE id=?`) |
| 799 | r := tx.QueryRowContext(ctx, query, trigger.AppID) |
| 800 | if err := r.Scan(new(int)); err != nil { |
| 801 | if err == sql.ErrNoRows { |
| 802 | return models.ErrAppsNotFound |
| 803 | } else if err != nil { |
| 804 | return err |
| 805 | } |
| 806 | } |
| 807 | |
| 808 | query = tx.Rebind(`SELECT app_id FROM fns WHERE id=?`) |
| 809 | r = tx.QueryRowContext(ctx, query, trigger.FnID) |
| 810 | var app_id string |
| 811 | if err := r.Scan(&app_id); err != nil { |
| 812 | if err == sql.ErrNoRows { |
| 813 | return models.ErrFnsNotFound |
| 814 | } else if err != nil { |
| 815 | return err |
| 816 | } |
| 817 | } |
| 818 | if app_id != trigger.AppID { |
| 819 | return models.ErrTriggerFnIDNotSameApp |
| 820 | } |
| 821 | |
| 822 | query = tx.Rebind(`SELECT 1 FROM triggers WHERE app_id=? AND type=? and source=?`) |
| 823 | r = tx.QueryRowContext(ctx, query, trigger.AppID, trigger.Type, trigger.Source) |
| 824 | err := r.Scan(new(int)) |
| 825 | if err == nil { |
| 826 | return models.ErrTriggerSourceExists |
| 827 | } else if err != sql.ErrNoRows { |
| 828 | return err |
| 829 | } |
| 830 | |
| 831 | query = tx.Rebind(`INSERT INTO triggers ( |
| 832 | id, |
| 833 | name, |
| 834 | app_id, |
| 835 | fn_id, |
| 836 | created_at, |
| 837 | updated_at, |
| 838 | type, |
| 839 | source, |
| 840 | annotations |
| 841 | ) |