Use xds-common go library.
[src/xds/xds-server.git] / lib / model / folder.go
1 package model
2
3 import (
4         "fmt"
5
6         common "github.com/iotbzh/xds-common/golib"
7         "github.com/iotbzh/xds-server/lib/syncthing"
8         "github.com/iotbzh/xds-server/lib/xdsconfig"
9 )
10
11 // Folder Represent a an XDS folder
12 type Folder struct {
13         Conf *xdsconfig.Config
14         SThg *st.SyncThing
15 }
16
17 // NewFolder Create a new instance of Model Folder
18 func NewFolder(cfg *xdsconfig.Config, st *st.SyncThing) *Folder {
19         return &Folder{
20                 Conf: cfg,
21                 SThg: st,
22         }
23 }
24
25 // GetFolderFromID retrieves the Folder config from id
26 func (c *Folder) GetFolderFromID(id string) *xdsconfig.FolderConfig {
27         if idx := c.Conf.Folders.GetIdx(id); idx != -1 {
28                 return &c.Conf.Folders[idx]
29         }
30         return nil
31 }
32
33 // UpdateAll updates all the current configuration
34 func (c *Folder) UpdateAll(newCfg xdsconfig.Config) error {
35         return fmt.Errorf("Not Supported")
36         /*
37                 if err := VerifyConfig(newCfg); err != nil {
38                         return err
39                 }
40
41                 // TODO: c.Builder = c.Builder.Update(newCfg.Builder)
42                 c.Folders = c.Folders.Update(newCfg.Folders)
43
44                 // FIXME To be tested & improved error handling
45                 for _, f := range c.Folders {
46                         if err := c.SThg.FolderChange(st.FolderChangeArg{
47                                 ID:           f.ID,
48                                 Label:        f.Label,
49                                 RelativePath: f.RelativePath,
50                                 SyncThingID:  f.SyncThingID,
51                                 ShareRootDir: c.FileConf.ShareRootDir,
52                         }); err != nil {
53                                 return err
54                         }
55                 }
56
57                 return nil
58         */
59 }
60
61 // UpdateFolder updates a specific folder into the current configuration
62 func (c *Folder) UpdateFolder(newFolder xdsconfig.FolderConfig) (xdsconfig.FolderConfig, error) {
63         // rootPath should not be empty
64         if newFolder.RootPath == "" {
65                 newFolder.RootPath = c.Conf.FileConf.ShareRootDir
66         }
67
68         // Sanity check of folder settings
69         if err := newFolder.Verify(); err != nil {
70                 return xdsconfig.FolderConfig{}, err
71         }
72
73         // Normalize path (needed for Windows path including bashlashes)
74         newFolder.RelativePath = common.PathNormalize(newFolder.RelativePath)
75
76         // Update config folder
77         c.Conf.Folders = c.Conf.Folders.Update(xdsconfig.FoldersConfig{newFolder})
78
79         // Update Syncthing folder
80         err := c.SThg.FolderChange(newFolder)
81
82         newFolder.BuilderSThgID = c.Conf.Builder.SyncThingID // FIXME - should be removed after local ST config rework
83         newFolder.Status = xdsconfig.FolderStatusEnable
84
85         return newFolder, err
86 }
87
88 // DeleteFolder deletes a specific folder
89 func (c *Folder) DeleteFolder(id string) (xdsconfig.FolderConfig, error) {
90         var fld xdsconfig.FolderConfig
91         var err error
92
93         if err = c.SThg.FolderDelete(id); err != nil {
94                 return fld, err
95         }
96
97         c.Conf.Folders, fld, err = c.Conf.Folders.Delete(id)
98
99         return fld, err
100 }
101
102 // ForceSync Force the synchronization of a folder
103 func (c *Folder) ForceSync(id string) error {
104         return c.SThg.FolderScan(id, "")
105 }
106
107 // IsFolderInSync Returns true when folder is in sync
108 func (c *Folder) IsFolderInSync(id string) (bool, error) {
109         return c.SThg.IsFolderInSync(id)
110 }