/
handlerUser.go
110 lines (91 loc) · 3.6 KB
/
handlerUser.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
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
// Copyright (c) 2016 OpenM++
// This code is licensed under the MIT license (see LICENSE.txt for details)
package main
import (
"net/http"
"os"
"path/filepath"
"github.com/openmpp/go/ompp/omppLog"
)
// userViewGetHandler return user views by model name or digest:
// GET /api/user/view/model/:model
// If multiple models with same name exist only one is returned.
// If no model view file in user home directory then response is 200 OK with is empty {} json payload
func userViewGetHandler(w http.ResponseWriter, r *http.Request) {
if !theCfg.isSingleUser {
http.Error(w, "Forbidden: model view reading disabled on the server", http.StatusForbidden)
return
}
dn := getRequestParam(r, "model")
// find model by digest or name
m, ok := theCatalog.ModelMetaByDigestOrName(dn)
if !ok {
http.Error(w, "Error: model not found "+dn, http.StatusNotFound)
return // not found error: model not found in model catalog
}
// open model.view.json file from user home directory
// if model.view.json not exist then return empty object {} response
fileName := m.Model.Name + ".view.json"
bt, err := os.ReadFile(filepath.Join(theCfg.homeDir, fileName))
if err != nil {
if os.IsNotExist(err) {
jsonResponseBytes(w, r, []byte{})
return // empty result: model view file not exist
}
omppLog.Log("Error: unable to read from ", fileName, err)
http.Error(w, "Error: unable to read from "+fileName, http.StatusInternalServerError)
return // model view file read error
}
// send file content as json response body
jsonResponseBytes(w, r, bt)
}
// userViewPutHandler write user views json body into home/user/modelName.view.json file:
// PUT /api/user/view/model/:model
// Model parameter can be a model name or digest.
// If multiple models with same name exist only one is used.
// If file name already exist in home directory it is truncated.
func userViewPutHandler(w http.ResponseWriter, r *http.Request) {
if !theCfg.isSingleUser {
http.Error(w, "Forbidden: model view saving disabled on the server", http.StatusForbidden)
return
}
dn := getRequestParam(r, "model")
// find model by digest or name
m, ok := theCatalog.ModelMetaByDigestOrName(dn)
if !ok {
http.Error(w, "Error: model not found "+dn, http.StatusNotFound)
return // not found error: model not found in model catalog
}
// copy request body into home/user/model.view.json file
_ = jsonRequestToFile(w, r, filepath.Join(theCfg.homeDir, m.Model.Name+".view.json"))
}
// userViewDeleteHandler delete model.view.json file from user home directory:
// DELETE /api/user/view/model/:model
// Model parameter can be a model name or digest.
// If multiple models with same name exist only one is used.
func userViewDeleteHandler(w http.ResponseWriter, r *http.Request) {
if !theCfg.isSingleUser {
http.Error(w, "Forbidden: model view saving disabled on the server", http.StatusForbidden)
return
}
dn := getRequestParam(r, "model")
// find model by digest or name
m, ok := theCatalog.ModelMetaByDigestOrName(dn)
if !ok {
http.Error(w, "Error: model not found "+dn, http.StatusNotFound)
return // not found error: model not found in model catalog
}
// delete model views file from home directory
fName := m.Model.Name + ".view.json"
err := os.Remove(filepath.Join(theCfg.homeDir, fName))
if err != nil {
if !os.IsNotExist(err) {
omppLog.Log("Error: unable to delete file ", fName, err)
http.Error(w, "Error: unable to delete file "+fName, http.StatusInternalServerError)
return // model view file read error
}
}
// on success
w.Header().Set("Content-Location", "/api/user/view/model/"+dn)
w.Header().Set("Content-Type", "text/plain")
}