/ system / system.go
system.go
 1  package system
 2  
 3  import (
 4  	"errors"
 5  
 6  	"github.com/mrusme/neonmodem/models/forum"
 7  	"github.com/mrusme/neonmodem/models/post"
 8  	"github.com/mrusme/neonmodem/models/reply"
 9  	"github.com/mrusme/neonmodem/system/adapter"
10  	"github.com/mrusme/neonmodem/system/all"
11  	"github.com/mrusme/neonmodem/system/discourse"
12  	"github.com/mrusme/neonmodem/system/hackernews"
13  	"github.com/mrusme/neonmodem/system/lemmy"
14  	"github.com/mrusme/neonmodem/system/lobsters"
15  	"go.uber.org/zap"
16  )
17  
18  type System interface {
19  	SetID(id int)
20  	GetID() int
21  	GetConfig() map[string]interface{}
22  	SetConfig(cfg *map[string]interface{})
23  	SetLogger(logger *zap.SugaredLogger)
24  	GetCapabilities() adapter.Capabilities
25  
26  	FilterValue() string
27  	Title() string
28  	Description() string
29  
30  	Connect(sysURL string) error
31  	Load() error
32  
33  	ListForums() ([]forum.Forum, error)
34  	ListPosts(forumID string) ([]post.Post, error)
35  	LoadPost(p *post.Post) error
36  	CreatePost(p *post.Post) error
37  	CreateReply(r *reply.Reply) error
38  }
39  
40  func New(
41  	sysType string,
42  	sysConfig *map[string]interface{},
43  	logger *zap.SugaredLogger,
44  ) (System, error) {
45  	var sys System
46  
47  	switch sysType {
48  	case "discourse":
49  		sys = new(discourse.System)
50  	case "lemmy":
51  		sys = new(lemmy.System)
52  	case "lobsters":
53  		sys = new(lobsters.System)
54  	case "hackernews":
55  		sys = new(hackernews.System)
56  	case "all":
57  		sys = new(all.System)
58  	default:
59  		return nil, errors.New("No such system")
60  	}
61  
62  	sys.SetConfig(sysConfig)
63  	sys.SetLogger(logger)
64  	err := sys.Load()
65  	if err != nil {
66  		return nil, err
67  	}
68  
69  	return sys, nil
70  }