Blame view

json_utility.go 3.44 KB
64041a2ea   Marko Tikvić   first commit
1
2
3
4
5
  package restutility
  
  import (
  	"net/http"
  	"strings"
8dbe745c3   Marko Tikvić   merged tables uti...
6
7
8
9
10
11
  	"encoding/json"
  	"errors"
  	"gopkg.in/rana/ora.v3"
  	"io"
  	"io/ioutil"
  	"fmt"
64041a2ea   Marko Tikvić   first commit
12
  )
8dbe745c3   Marko Tikvić   merged tables uti...
13
  var allPayloads []Payload
64041a2ea   Marko Tikvić   first commit
14
15
16
17
18
19
20
21
  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...
22
23
24
25
26
27
28
29
30
  type CorrelationField struct {
  	Result   string   `json:"result"`
  	Elements []string `json:"elements"`
  	Type     string   `json:"type"`
  }
  
  type Translation struct {
  	Language string `json:"language"`
  	FieldsLabels map[string]string `json:"fieldsLabels"`
64041a2ea   Marko Tikvić   first commit
31
  }
8dbe745c3   Marko Tikvić   merged tables uti...
32
33
  type Payload struct {
  	Type         string             `json:"tableType"`
64041a2ea   Marko Tikvić   first commit
34
35
  	Method	     string             `json:"method"`
  	Params	     map[string]string  `json:"params"`
8dbe745c3   Marko Tikvić   merged tables uti...
36
  	Lang	     []Translation      `json:"lang"`
64041a2ea   Marko Tikvić   first commit
37
  	Fields	     []Field            `json:"fields"`
c430f3af5   Marko Tikvić   fixed camel case ...
38
  	Correlations []CorrelationField `json:"correlationFields"`
64041a2ea   Marko Tikvić   first commit
39
40
41
42
  	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...
43
44
  func NewPayload(r *http.Request, table string) Payload {
  	var pload Payload
64041a2ea   Marko Tikvić   first commit
45

8dbe745c3   Marko Tikvić   merged tables uti...
46
47
48
49
50
51
  	pload.Method = strings.ToLower(r.Method + " " + r.URL.Path)
  	pload.Params = make(map[string]string, 0)
  	pload.Lang = loadTranslations(allPayloads, table)
  	pload.Fields = loadFields(allPayloads, table)
  	pload.IdField = loadIdField(allPayloads, table)
  	pload.Correlations = loadCorrelations(allPayloads, table)
64041a2ea   Marko Tikvić   first commit
52

8dbe745c3   Marko Tikvić   merged tables uti...
53
54
  	return pload
  }
64041a2ea   Marko Tikvić   first commit
55

8dbe745c3   Marko Tikvić   merged tables uti...
56
57
58
  func DeliverPayload(w http.ResponseWriter, payload Payload) {
  	json.NewEncoder(w).Encode(payload)
  	payload.Data = nil
64041a2ea   Marko Tikvić   first commit
59
  }
8dbe745c3   Marko Tikvić   merged tables uti...
60
61
62
63
64
65
66
67
68
69
70
71
72
  func loadTranslations(payloads []Payload, id string) []Translation {
  	translations := make([]Translation, 0)
  
  	for _, pload := range payloads {
  		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
73
  	}
8dbe745c3   Marko Tikvić   merged tables uti...
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
  
  	return translations
  }
  
  func loadFields(payloads []Payload, id string) []Field {
  	fields := make([]Field, 0)
  
  	for _, pload := range payloads {
  		if pload.Type == id{
  			for _, f := range pload.Fields {
  				fields = append(fields, f)
  			}
  		}
  	}
  
  	return fields
  }
  
  func loadIdField(payloads []Payload, id string) string {
  	for _, pload := range payloads {
  		if pload.Type == id {
  			return pload.IdField
  		}
  	}
  	return ""
  }
  
  func loadCorrelations(payloads []Payload, id string) []CorrelationField {
  	resp := make([]CorrelationField, 0)
  
  	for _, pload := range payloads {
  		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")
  	}
  	fmt.Printf("broj ucitanih tabela: %d
  ", len(allPayloads))
  	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 {
  			fmt.Printf("mega error: %v
  ", err)
  		}
64041a2ea   Marko Tikvić   first commit
150
  	}
8dbe745c3   Marko Tikvić   merged tables uti...
151
  	return bytes, nil
64041a2ea   Marko Tikvić   first commit
152
  }