Blame view

json_utility.go 4.45 KB
ea858b8a7   Marko Tikvić   refactoring
1
  package webutility
64041a2ea   Marko Tikvić   first commit
2
3
  
  import (
1d0f61553   Marko Tikvić   can't fetch clob
4
  	"fmt"
64041a2ea   Marko Tikvić   first commit
5
  	"net/http"
8dbe745c3   Marko Tikvić   merged tables uti...
6
7
  	"encoding/json"
  	"errors"
8dbe745c3   Marko Tikvić   merged tables uti...
8
  	"io"
1d0f61553   Marko Tikvić   can't fetch clob
9
  	//"io/ioutil"
17a4d0447   Marko Tikvić   mutex lock for pa...
10
  	"sync"
1d0f61553   Marko Tikvić   can't fetch clob
11
12
13
  
  	//"gopkg.in/rana/ora.v3"
  	"gopkg.in/rana/ora.v4"
64041a2ea   Marko Tikvić   first commit
14
  )
17a4d0447   Marko Tikvić   mutex lock for pa...
15
  var mu = &sync.Mutex{}
6ec91280b   Marko Tikvić   working on docume...
16
  var payloads []payloadBuff
8dbe745c3   Marko Tikvić   merged tables uti...
17

64041a2ea   Marko Tikvić   first commit
18
19
20
21
22
23
24
25
  type LangMap map[string]map[string]string
  
  type Field struct {
  	Parameter  string `json:"param"`
  	Type       string `json:"type"`
  	Visible    bool   `json:"visible"`
  	Editable   bool   `json:"editable"`
  }
8dbe745c3   Marko Tikvić   merged tables uti...
26
27
28
29
30
31
32
  type CorrelationField struct {
  	Result   string   `json:"result"`
  	Elements []string `json:"elements"`
  	Type     string   `json:"type"`
  }
  
  type Translation struct {
ecec68b18   Marko Tikvić   updated todo list
33
  	Language     string            `json:"language"`
8dbe745c3   Marko Tikvić   merged tables uti...
34
  	FieldsLabels map[string]string `json:"fieldsLabels"`
64041a2ea   Marko Tikvić   first commit
35
  }
4a51e54d7   Marko Tikvić   simplified
36
  type payloadBuff struct {
8dbe745c3   Marko Tikvić   merged tables uti...
37
  	Type         string             `json:"tableType"`
64041a2ea   Marko Tikvić   first commit
38
39
  	Method	     string             `json:"method"`
  	Params	     map[string]string  `json:"params"`
8dbe745c3   Marko Tikvić   merged tables uti...
40
  	Lang	     []Translation      `json:"lang"`
64041a2ea   Marko Tikvić   first commit
41
  	Fields	     []Field            `json:"fields"`
c430f3af5   Marko Tikvić   fixed camel case ...
42
  	Correlations []CorrelationField `json:"correlationFields"`
64041a2ea   Marko Tikvić   first commit
43
  	IdField      string             `json:"idField"`
6ec91280b   Marko Tikvić   working on docume...
44

64041a2ea   Marko Tikvić   first commit
45
46
47
  	// Data can only hold slices of any type. It can't be used for itteration
  	Data	     interface{}        `json:"data"`
  }
4a51e54d7   Marko Tikvić   simplified
48
49
50
51
52
53
54
  type Payload struct {
  	Method	     string             `json:"method"`
  	Params	     map[string]string  `json:"params"`
  	Lang	     []Translation      `json:"lang"`
  	Fields	     []Field            `json:"fields"`
  	Correlations []CorrelationField `json:"correlationFields"`
  	IdField      string             `json:"idField"`
e1fbb41f9   Marko Tikvić   added comments
55

4a51e54d7   Marko Tikvić   simplified
56
57
58
  	// Data can only hold slices of any type. It can't be used for itteration
  	Data	     interface{}        `json:"data"`
  }
6ec91280b   Marko Tikvić   working on docume...
59
  // NewPayload returs a payload sceleton for provided table.
8dbe745c3   Marko Tikvić   merged tables uti...
60
61
  func NewPayload(r *http.Request, table string) Payload {
  	var pload Payload
64041a2ea   Marko Tikvić   first commit
62

4a51e54d7   Marko Tikvić   simplified
63
  	pload.Method = r.Method + " " + r.URL.Path
90f4ed079   Marko Tikvić   sped up loadTable()
64
65
  	if table != "" {
  		pload.Params = make(map[string]string, 0)
6ec91280b   Marko Tikvić   working on docume...
66
67
68
69
  		pload.Lang = translations(table)
  		pload.Fields = fields(table)
  		pload.IdField = id(table)
  		pload.Correlations = correlations(table)
90f4ed079   Marko Tikvić   sped up loadTable()
70
  	}
8dbe745c3   Marko Tikvić   merged tables uti...
71
72
  	return pload
  }
64041a2ea   Marko Tikvić   first commit
73

6ec91280b   Marko Tikvić   working on docume...
74
  // DeliverPayload encodes payload to w.
8dbe745c3   Marko Tikvić   merged tables uti...
75
76
77
  func DeliverPayload(w http.ResponseWriter, payload Payload) {
  	json.NewEncoder(w).Encode(payload)
  	payload.Data = nil
64041a2ea   Marko Tikvić   first commit
78
  }
6ec91280b   Marko Tikvić   working on docume...
79
80
81
  // translations returns a slice of translations for a payload/table of ptype type.
  func translations(ptype string) []Translation {
  	var translations []Translation
8dbe745c3   Marko Tikvić   merged tables uti...
82

6ec91280b   Marko Tikvić   working on docume...
83
84
  	for _, pload := range payloads {
  		if pload.Type == ptype {
8dbe745c3   Marko Tikvić   merged tables uti...
85
  			for _, t := range pload.Lang {
8dbe745c3   Marko Tikvić   merged tables uti...
86
87
88
89
90
91
  				translations = append(translations, Translation{
  					Language: t.Language,
  					FieldsLabels: t.FieldsLabels,
  				})
  			}
  		}
64041a2ea   Marko Tikvić   first commit
92
  	}
8dbe745c3   Marko Tikvić   merged tables uti...
93
94
95
  
  	return translations
  }
6ec91280b   Marko Tikvić   working on docume...
96
97
98
  // fields returns a slice of fields for a payload/table of ptype type.
  func fields(ptype string) []Field {
  	var fields []Field
8dbe745c3   Marko Tikvić   merged tables uti...
99

6ec91280b   Marko Tikvić   working on docume...
100
101
  	for _, pload := range payloads {
  		if pload.Type == ptype {
8dbe745c3   Marko Tikvić   merged tables uti...
102
103
104
105
106
107
108
109
  			for _, f := range pload.Fields {
  				fields = append(fields, f)
  			}
  		}
  	}
  
  	return fields
  }
6ec91280b   Marko Tikvić   working on docume...
110
111
112
113
  // id returns the name of ID field of a payload/table of ptype type.
  func id(ptype string) string {
  	for _, pload := range payloads {
  		if pload.Type == ptype {
8dbe745c3   Marko Tikvić   merged tables uti...
114
115
116
117
118
  			return pload.IdField
  		}
  	}
  	return ""
  }
6ec91280b   Marko Tikvić   working on docume...
119
120
121
  // correlations returns a slice of correlation fields for a payload/table of ptype type.
  func correlations(ptype string) []CorrelationField {
  	var corr []CorrelationField
8dbe745c3   Marko Tikvić   merged tables uti...
122

6ec91280b   Marko Tikvić   working on docume...
123
124
125
126
  	for _, pload := range payloads {
  		if pload.Type == ptype {
  			for _, c := range pload.Correlations {
  				corr = append(corr, c)
8dbe745c3   Marko Tikvić   merged tables uti...
127
128
129
  			}
  		}
  	}
6ec91280b   Marko Tikvić   working on docume...
130
  	return corr
8dbe745c3   Marko Tikvić   merged tables uti...
131
  }
6ec91280b   Marko Tikvić   working on docume...
132
133
  // InitTables loads all payloads in the payloads variable.
  // Returns an error if it fails.
8dbe745c3   Marko Tikvić   merged tables uti...
134
  func InitTables(db *ora.Ses, project string) error {
1d0f61553   Marko Tikvić   can't fetch clob
135
136
137
138
  	jsonbuf, err := fetchJSON(db, project)
  	if err != nil {
  		return err
  	}
17a4d0447   Marko Tikvić   mutex lock for pa...
139
140
  	mu.Lock()
  	defer mu.Unlock()
1d0f61553   Marko Tikvić   can't fetch clob
141
  	json.Unmarshal([]byte(jsonbuf), &payloads)
6ec91280b   Marko Tikvić   working on docume...
142
  	if len(payloads) == 0 {
8dbe745c3   Marko Tikvić   merged tables uti...
143
144
  		return errors.New("tables config is corrupt")
  	}
8dbe745c3   Marko Tikvić   merged tables uti...
145
146
  	return nil
  }
6ec91280b   Marko Tikvić   working on docume...
147
148
  // fetchJSON returns a byte slice of JSON configuration file from TABLES_CONFIG table.
  // Returns an error if it fails.
1d0f61553   Marko Tikvić   can't fetch clob
149
150
  func fetchJSON(db *ora.Ses, project string) (string, error) {
  	stmt, err := db.Prep(`SELECT JSON_CLOB FROM TABLES_CONFIG WHERE PROJEKAT` + EqualQuotes(project), ora.S)
8dbe745c3   Marko Tikvić   merged tables uti...
151
  	defer stmt.Close()
8dbe745c3   Marko Tikvić   merged tables uti...
152
  	if err != nil {
1d0f61553   Marko Tikvić   can't fetch clob
153
  		return "", err
8dbe745c3   Marko Tikvić   merged tables uti...
154
  	}
1d0f61553   Marko Tikvić   can't fetch clob
155
  	fmt.Println("prep passes")
8dbe745c3   Marko Tikvić   merged tables uti...
156
157
158
  
  	rset, err := stmt.Qry()
  	if err != nil {
1d0f61553   Marko Tikvić   can't fetch clob
159
160
  		fmt.Println(err)
  		return "", err
8dbe745c3   Marko Tikvić   merged tables uti...
161
  	}
1d0f61553   Marko Tikvić   can't fetch clob
162
  	fmt.Println("query passes")
8dbe745c3   Marko Tikvić   merged tables uti...
163

1d0f61553   Marko Tikvić   can't fetch clob
164
  	var data string
8dbe745c3   Marko Tikvić   merged tables uti...
165
  	if rset.Next() {
1d0f61553   Marko Tikvić   can't fetch clob
166
  		data = rset.Row[0].(string)
64041a2ea   Marko Tikvić   first commit
167
  	}
1d0f61553   Marko Tikvić   can't fetch clob
168
  	return data, nil
64041a2ea   Marko Tikvić   first commit
169
  }
6ec91280b   Marko Tikvić   working on docume...
170
171
  // DecodeJSON decodes JSON data from r to v.
  // Returns an error if it fails.
d5192378d   Marko Tikvić   added json decodi...
172
173
174
  func DecodeJSON(r io.Reader, v interface{}) error {
  	return json.NewDecoder(r).Decode(v)
  }