1
0
Fork 0
mirror of https://github.com/documize/community.git synced 2025-07-19 21:29:42 +02:00

Write HTTP methods, database connection limits, product entity

This commit is contained in:
Harvey Kandola 2016-07-24 14:49:40 -07:00
parent 360d3d93e9
commit 7d38102eb6
10 changed files with 870 additions and 588 deletions

1
.gitignore vendored
View file

@ -18,7 +18,6 @@ _convert
bin/* bin/*
dist/* dist/*
embed/bindata/* embed/bindata/*
embed/bindata_assetfs.go
app/dist/* app/dist/*
app/dist-prod/* app/dist-prod/*

View file

@ -21,8 +21,8 @@ export default Ember.Route.extend(ApplicationRouteMixin, {
appMeta: service(), appMeta: service(),
session: service(), session: service(),
beforeModel() { beforeModel(transition) {
return this.get('appMeta').boot().then(data => { return this.get('appMeta').boot(transition.targetName).then(data => {
if (this.get('session.session.authenticator') !== "authenticator:documize" && data.allowAnonymousAccess) { if (this.get('session.session.authenticator') !== "authenticator:documize" && data.allowAnonymousAccess) {
return this.get('session').authenticate('authenticator:anonymous', data); return this.get('session').authenticate('authenticator:anonymous', data);
} }

View file

@ -34,7 +34,7 @@ export default Ember.Service.extend({
return [this.get('host'), endpoint].join('/'); return [this.get('host'), endpoint].join('/');
}, },
boot() { boot(/*requestedUrl*/) {
let dbhash; let dbhash;
if (is.not.null(document.head.querySelector("[property=dbhash]"))) { if (is.not.null(document.head.querySelector("[property=dbhash]"))) {
dbhash = document.head.querySelector("[property=dbhash]").content; dbhash = document.head.querySelector("[property=dbhash]").content;

View file

@ -18,6 +18,7 @@ import (
"net/http" "net/http"
"text/template" "text/template"
"github.com/documize/community/core"
"github.com/documize/community/core/api/entity" "github.com/documize/community/core/api/entity"
"github.com/documize/community/core/api/request" "github.com/documize/community/core/api/request"
"github.com/documize/community/core/log" "github.com/documize/community/core/log"
@ -40,11 +41,13 @@ func GetMeta(w http.ResponseWriter, r *http.Request) {
return return
} }
product := core.Product()
data.OrgID = org.RefID data.OrgID = org.RefID
data.Title = org.Title data.Title = org.Title
data.Message = org.Message data.Message = org.Message
data.AllowAnonymousAccess = org.AllowAnonymousAccess data.AllowAnonymousAccess = org.AllowAnonymousAccess
data.Version = AppVersion data.Version = product.Version
json, err := json.Marshal(data) json, err := json.Marshal(data)

View file

@ -18,6 +18,7 @@ import (
"strings" "strings"
"github.com/codegangsta/negroni" "github.com/codegangsta/negroni"
"github.com/documize/community/core"
"github.com/documize/community/core/api/plugins" "github.com/documize/community/core/api/plugins"
"github.com/documize/community/core/database" "github.com/documize/community/core/database"
"github.com/documize/community/core/environment" "github.com/documize/community/core/environment"
@ -26,15 +27,11 @@ import (
"github.com/gorilla/mux" "github.com/gorilla/mux"
) )
const (
// AppVersion does what it says
// Note: versioning scheme is not http://semver.org
AppVersion = "0.15.2"
)
var port, certFile, keyFile, forcePort2SSL string var port, certFile, keyFile, forcePort2SSL string
var product core.ProdInfo
func init() { func init() {
product = core.Product()
environment.GetString(&certFile, "cert", false, "the cert.pem file used for https", nil) environment.GetString(&certFile, "cert", false, "the cert.pem file used for https", nil)
environment.GetString(&keyFile, "key", false, "the key.pem file used for https", nil) environment.GetString(&keyFile, "key", false, "the key.pem file used for https", nil)
environment.GetString(&port, "port", false, "http/https port number", nil) environment.GetString(&port, "port", false, "http/https port number", nil)
@ -52,7 +49,7 @@ func Serve(ready chan struct{}) {
os.Exit(1) os.Exit(1)
} }
log.Info(fmt.Sprintf("Documize version %s", AppVersion)) log.Info(fmt.Sprintf("Starting %s version %s", product.Title, product.Version))
switch web.SiteMode { switch web.SiteMode {
case web.SiteModeOffline: case web.SiteModeOffline:
@ -148,7 +145,8 @@ func cors(w http.ResponseWriter, r *http.Request, next http.HandlerFunc) {
} }
func metrics(w http.ResponseWriter, r *http.Request, next http.HandlerFunc) { func metrics(w http.ResponseWriter, r *http.Request, next http.HandlerFunc) {
w.Header().Add("X-Documize-Version", AppVersion)
w.Header().Add("X-Documize-Version", product.Version)
w.Header().Add("Cache-Control", "no-cache") w.Header().Add("Cache-Control", "no-cache")
// Prevent page from being displayed in an iframe // Prevent page from being displayed in an iframe
@ -163,7 +161,7 @@ func metrics(w http.ResponseWriter, r *http.Request, next http.HandlerFunc) {
} }
func version(w http.ResponseWriter, r *http.Request) { func version(w http.ResponseWriter, r *http.Request) {
if _, err := w.Write([]byte(AppVersion)); err != nil { if _, err := w.Write([]byte(product.Version)); err != nil {
log.Error("versionHandler", err) log.Error("versionHandler", err)
} }
} }

View file

@ -15,14 +15,15 @@ import (
"fmt" "fmt"
"os" "os"
"strings" "strings"
"time"
"github.com/jmoiron/sqlx" "github.com/jmoiron/sqlx"
"github.com/documize/community/core/database" "github.com/documize/community/core/database"
"github.com/documize/community/core/web"
"github.com/documize/community/core/environment" "github.com/documize/community/core/environment"
"github.com/documize/community/core/log" "github.com/documize/community/core/log"
"github.com/documize/community/core/utility" "github.com/documize/community/core/utility"
"github.com/documize/community/core/web"
) )
var connectionString string var connectionString string
@ -59,6 +60,7 @@ func init() {
Db.SetMaxIdleConns(30) Db.SetMaxIdleConns(30)
Db.SetMaxOpenConns(100) Db.SetMaxOpenConns(100)
Db.SetConnMaxLifetime(time.Second * 14400)
err = Db.Ping() err = Db.Ping()

126
core/api/util/writeHTTP.go Normal file
View file

@ -0,0 +1,126 @@
// Copyright 2016 Documize Inc. <legal@documize.com>. All rights reserved.
//
// This software (Documize Community Edition) is licensed under
// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html
//
// You can operate outside the AGPL restrictions by purchasing
// Documize Enterprise Edition and obtaining a commercial license
// by contacting <sales@documize.com>.
//
// https://documize.com
package util
import (
"fmt"
"net/http"
"github.com/documize/community/core/log"
)
func WritePayloadError(w http.ResponseWriter, method string, err error) {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.WriteHeader(http.StatusBadRequest)
_, err2 := w.Write([]byte("{Error: 'Bad payload'}"))
log.IfErr(err2)
log.Error(fmt.Sprintf("Unable to decode HTML request body for method %s", method), err)
}
func WriteTransactionError(w http.ResponseWriter, method string, err error) {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.WriteHeader(http.StatusInternalServerError)
_, err2 := w.Write([]byte("{Error: 'No transaction'}"))
log.IfErr(err2)
log.Error(fmt.Sprintf("Unable to get database transaction for method %s", method), err)
}
func WriteMissingDataError(w http.ResponseWriter, method, parameter string) {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.WriteHeader(http.StatusBadRequest)
_, err := w.Write([]byte("{Error: 'Missing data'}"))
log.IfErr(err)
log.Info(fmt.Sprintf("Missing data %s for method %s", parameter, method))
}
func WriteNotFoundError(w http.ResponseWriter, method string, id string) {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.WriteHeader(http.StatusNotFound)
_, err := w.Write([]byte("{Error: 'Not found'}"))
log.IfErr(err)
log.Info(fmt.Sprintf("Not found ID %s for method %s", id, method))
}
func WriteGeneralSQLError(w http.ResponseWriter, method string, err error) {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.WriteHeader(http.StatusBadRequest)
_, err2 := w.Write([]byte("{Error: 'SQL error'}"))
log.IfErr(err2)
log.Error(fmt.Sprintf("General SQL error for method %s", method), err)
}
func WriteJSONMarshalError(w http.ResponseWriter, method, entity string, err error) {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.WriteHeader(http.StatusBadRequest)
_, err2 := w.Write([]byte("{Error: 'JSON marshal failed'}"))
log.IfErr(err2)
log.Error(fmt.Sprintf("Failed to JSON marshal %s for method %s", entity, method), err)
}
func WriteServerError(w http.ResponseWriter, method string, err error) {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.WriteHeader(http.StatusBadRequest)
_, err2 := w.Write([]byte("{Error: 'Internal server error'}"))
log.IfErr(err2)
log.Error(fmt.Sprintf("Internal server error for method %s", method), err)
}
func WriteDuplicateError(w http.ResponseWriter, method, entity string) {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.WriteHeader(http.StatusConflict)
_, err := w.Write([]byte("{Error: 'Duplicate record'}"))
log.IfErr(err)
log.Info(fmt.Sprintf("Duplicate %s record detected for method %s", entity, method))
}
func WriteUnauthorizedError(w http.ResponseWriter) {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.WriteHeader(http.StatusUnauthorized)
_, err := w.Write([]byte("{Error: 'Unauthorized'}"))
log.IfErr(err)
}
func WriteForbiddenError(w http.ResponseWriter) {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.WriteHeader(http.StatusForbidden)
_, err := w.Write([]byte("{Error: 'Forbidden'}"))
log.IfErr(err)
}
func WriteBadRequestError(w http.ResponseWriter, method, message string) {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.WriteHeader(http.StatusBadRequest)
_, err := w.Write([]byte("{Error: 'Bad Request'}"))
log.IfErr(err)
log.Info(fmt.Sprintf("Bad Request %s for method %s", message, method))
}
func WriteSuccessBytes(w http.ResponseWriter, data []byte) {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.WriteHeader(http.StatusOK)
_, err := w.Write(data)
log.IfErr(err)
}
func WriteSuccessString(w http.ResponseWriter, data string) {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.WriteHeader(http.StatusOK)
_, err := w.Write([]byte(data))
log.IfErr(err)
}
func WriteSuccessEmptyJSON(w http.ResponseWriter) {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.WriteHeader(http.StatusOK)
_, err := w.Write([]byte("{}"))
log.IfErr(err)
}

37
core/product.go Normal file
View file

@ -0,0 +1,37 @@
// Copyright 2016 Documize Inc. <legal@documize.com>. All rights reserved.
//
// This software (Documize Community Edition) is licensed under
// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html
//
// You can operate outside the AGPL restrictions by purchasing
// Documize Enterprise Edition and obtaining a commercial license
// by contacting <sales@documize.com>.
//
// https://documize.com
// Package extensions represents Enterprise Edition capabilities.
package core
import "fmt"
// ProdInfo describes a product
type ProdInfo struct {
Edition string
Title string
Version string
Major string
Minor string
Patch string
}
// Product returns product edition details
func Product() (p ProdInfo) {
p.Major = "0"
p.Minor = "16"
p.Patch = "0"
p.Version = fmt.Sprintf("%s.%s.%s", p.Major, p.Minor, p.Patch)
p.Edition = "Community"
p.Title = fmt.Sprintf("Documize %s Edition", p.Edition)
return p
}

File diff suppressed because one or more lines are too long