github.com/TrueBlocks/trueblocks-core/src/apps/chifra@v0.0.0-20241022031540-b362680128f7/internal/monitors/handle_crud.go (about)

     1  // Copyright 2021 The TrueBlocks Authors. All rights reserved.
     2  // Use of this source code is governed by a license that can
     3  // be found in the LICENSE file.
     4  
     5  package monitorsPkg
     6  
     7  import (
     8  	"github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/base"
     9  	"github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/file"
    10  	"github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/logger"
    11  	"github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/monitor"
    12  	"github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/output"
    13  	"github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/validate"
    14  )
    15  
    16  // HandleCrud handles the chifra monitors delete, undelete, remove and decache commands.
    17  //
    18  // [State]     | Delete | Undelete | Remove |
    19  // ------------|--------|-------------------|
    20  // Not Deleted | Delete	| Error    | Error  |
    21  // Deleted     | Error  | Undelete | Remove |
    22  // ------------|--------|-------------------|
    23  func (opts *MonitorsOptions) HandleCrud(rCtx *output.RenderCtx) error {
    24  	chain := opts.Globals.Chain
    25  	for _, addr := range opts.Addrs {
    26  		m, _ := monitor.NewMonitor(chain, base.HexToAddress(addr), false)
    27  		if !file.FileExists(m.Path()) {
    28  			return validate.Usage("No monitor was found for address " + addr + ".")
    29  
    30  		} else {
    31  			if opts.Undelete && !m.IsDeleted() {
    32  				return validate.Usage("Monitor for {0} must be deleted before being undeleted.", addr)
    33  
    34  			} else {
    35  				if opts.Delete && opts.Remove {
    36  					// do nothing, it will be resolved below...
    37  
    38  				} else {
    39  					if opts.Delete && m.IsDeleted() {
    40  						return validate.Usage("Monitor for {0} is already deleted.", addr)
    41  
    42  					} else if opts.Remove && !m.IsDeleted() {
    43  						return validate.Usage("Cannot remove a file that has not previously been deleted.")
    44  					}
    45  				}
    46  			}
    47  		}
    48  	}
    49  
    50  	for _, addr := range opts.Addrs {
    51  		m, _ := monitor.NewMonitor(chain, base.HexToAddress(addr), false)
    52  		if opts.Undelete {
    53  			_ = m.ReadMonitorHeader()
    54  			m.UnDelete()
    55  			m.Close()
    56  			logger.Info(("Monitor " + addr + " was undeleted."))
    57  
    58  		} else {
    59  			if opts.Delete {
    60  				_ = m.ReadMonitorHeader()
    61  				m.Delete()
    62  				m.Close()
    63  				logger.Info(("Monitor " + addr + " was deleted but not removed."))
    64  			}
    65  
    66  			if opts.Remove {
    67  				wasRemoved, err := m.Remove()
    68  				if !wasRemoved || err != nil {
    69  					logger.Info(("Monitor for " + addr + " was not removed (" + err.Error() + ")"))
    70  				} else {
    71  					logger.Info(("Monitor for " + addr + " was permanently removed."))
    72  				}
    73  			}
    74  		}
    75  	}
    76  
    77  	return nil
    78  }