Blame view

json_utility.go 3.75 KB
64041a2ea   Marko Tikvić   first commit
1
2
3
4
  package restutility
  
  import (
  	"net/http"
8dbe745c3   Marko Tikvić   merged tables uti...
5
6
7
8
9
  	"encoding/json"
  	"errors"
  	"gopkg.in/rana/ora.v3"
  	"io"
  	"io/ioutil"
64041a2ea   Marko Tikvić   first commit
10
  )
4a51e54d7   Marko Tikvić   simplified
11
  var allPayloads []payloadBuff
8dbe745c3   Marko Tikvić   merged tables uti...
12

64041a2ea   Marko Tikvić   first commit
13
14
15
16
17
18
19
20
  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...
21
22
23
24
25
26
27
  type CorrelationField struct {
  	Result   string   `json:"result"`
  	Elements []string `json:"elements"`
  	Type     string   `json:"type"`
  }
  
  type Translation struct {
ecec68b18   Marko Tikvić   updated todo list
28
  	Language     string            `json:"language"`
8dbe745c3   Marko Tikvić   merged tables uti...
29
  	FieldsLabels map[string]string `json:"fieldsLabels"`
64041a2ea   Marko Tikvić   first commit
30
  }
4a51e54d7   Marko Tikvić   simplified
31
  type payloadBuff struct {
8dbe745c3   Marko Tikvić   merged tables uti...
32
  	Type         string             `json:"tableType"`
64041a2ea   Marko Tikvić   first commit
33
34
  	Method	     string             `json:"method"`
  	Params	     map[string]string  `json:"params"`
8dbe745c3   Marko Tikvić   merged tables uti...
35
  	Lang	     []Translation      `json:"lang"`
64041a2ea   Marko Tikvić   first commit
36
  	Fields	     []Field            `json:"fields"`
c430f3af5   Marko Tikvić   fixed camel case ...
37
  	Correlations []CorrelationField `json:"correlationFields"`
64041a2ea   Marko Tikvić   first commit
38
39
40
41
  	IdField      string             `json:"idField"`
  	// Data can only hold slices of any type. It can't be used for itteration
  	Data	     interface{}        `json:"data"`
  }
4a51e54d7   Marko Tikvić   simplified
42
43
44
45
46
47
48
49
50
51
  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"`
  	// Data can only hold slices of any type. It can't be used for itteration
  	Data	     interface{}        `json:"data"`
  }
8dbe745c3   Marko Tikvić   merged tables uti...
52
53
  func NewPayload(r *http.Request, table string) Payload {
  	var pload Payload
64041a2ea   Marko Tikvić   first commit
54

4a51e54d7   Marko Tikvić   simplified
55
  	pload.Method = r.Method + " " + r.URL.Path
8dbe745c3   Marko Tikvić   merged tables uti...
56
  	pload.Params = make(map[string]string, 0)
4a51e54d7   Marko Tikvić   simplified
57
58
59
60
  	pload.Lang = loadTranslations(table)
  	pload.Fields = loadFields(table)
  	pload.IdField = loadIdField(table)
  	pload.Correlations = loadCorrelations(table)
64041a2ea   Marko Tikvić   first commit
61

8dbe745c3   Marko Tikvić   merged tables uti...
62
63
  	return pload
  }
64041a2ea   Marko Tikvić   first commit
64

8dbe745c3   Marko Tikvić   merged tables uti...
65
66
67
  func DeliverPayload(w http.ResponseWriter, payload Payload) {
  	json.NewEncoder(w).Encode(payload)
  	payload.Data = nil
64041a2ea   Marko Tikvić   first commit
68
  }
4a51e54d7   Marko Tikvić   simplified
69
  func loadTranslations(id string) []Translation {
8dbe745c3   Marko Tikvić   merged tables uti...
70
  	translations := make([]Translation, 0)
4a51e54d7   Marko Tikvić   simplified
71
  	for _, pload := range allPayloads {
8dbe745c3   Marko Tikvić   merged tables uti...
72
73
74
75
76
77
78
79
80
  		if pload.Type == id {
  			for _, t := range pload.Lang {
  				//translations[t.Language] = t.FieldsLabels
  				translations = append(translations, Translation{
  					Language: t.Language,
  					FieldsLabels: t.FieldsLabels,
  				})
  			}
  		}
64041a2ea   Marko Tikvić   first commit
81
  	}
8dbe745c3   Marko Tikvić   merged tables uti...
82
83
84
  
  	return translations
  }
4a51e54d7   Marko Tikvić   simplified
85
  func loadFields(id string) []Field {
8dbe745c3   Marko Tikvić   merged tables uti...
86
  	fields := make([]Field, 0)
4a51e54d7   Marko Tikvić   simplified
87
  	for _, pload := range allPayloads {
8dbe745c3   Marko Tikvić   merged tables uti...
88
89
90
91
92
93
94
95
96
  		if pload.Type == id{
  			for _, f := range pload.Fields {
  				fields = append(fields, f)
  			}
  		}
  	}
  
  	return fields
  }
4a51e54d7   Marko Tikvić   simplified
97
98
  func loadIdField(id string) string {
  	for _, pload := range allPayloads {
8dbe745c3   Marko Tikvić   merged tables uti...
99
100
101
102
103
104
  		if pload.Type == id {
  			return pload.IdField
  		}
  	}
  	return ""
  }
4a51e54d7   Marko Tikvić   simplified
105
  func loadCorrelations(id string) []CorrelationField {
8dbe745c3   Marko Tikvić   merged tables uti...
106
  	resp := make([]CorrelationField, 0)
4a51e54d7   Marko Tikvić   simplified
107
  	for _, pload := range allPayloads {
8dbe745c3   Marko Tikvić   merged tables uti...
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
  		if pload.Type == id {
  			for _, f := range pload.Correlations {
  				resp = append(resp, f)
  			}
  		}
  	}
  
  	return resp
  }
  
  func InitTables(db *ora.Ses, project string) error {
  	jsonbuf, _ := fetchTablesConfig(db, EqualQuotes(project))
  	json.Unmarshal(jsonbuf, &allPayloads)
  	if len(allPayloads) == 0 {
  		return errors.New("tables config is corrupt")
  	}
8dbe745c3   Marko Tikvić   merged tables uti...
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
  	return nil
  }
  
  func fetchTablesConfig(db *ora.Ses, project string) ([]byte, error) {
  	stmt, err := db.Prep(`SELECT
  		JSON_CLOB
  		FROM TABLES_CONFIG
  		WHERE PROJEKAT` + project, ora.S)
  	defer stmt.Close()
  
  	if err != nil {
  		return nil, err
  	}
  
  	rset, err := stmt.Qry()
  	if err != nil {
  		return nil, err
  	}
  
  	bytes := make([]byte, 0)
  	if rset.Next() {
  		lob := rset.Row[0].(io.Reader)
  		bytes, err = ioutil.ReadAll(lob)
  		if err != nil {
4a51e54d7   Marko Tikvić   simplified
148
149
150
  			// TODO: Find a fix for this.
  			// Ignore, it's some weird streaming read/write LOB error.
  			//return nil, err
8dbe745c3   Marko Tikvić   merged tables uti...
151
  		}
64041a2ea   Marko Tikvić   first commit
152
  	}
8dbe745c3   Marko Tikvić   merged tables uti...
153
  	return bytes, nil
64041a2ea   Marko Tikvić   first commit
154
  }