From da7cacb57eb154cbfcbaeec38edb7894562e0b20 Mon Sep 17 00:00:00 2001 From: "didier.amyot" Date: Wed, 7 May 2014 21:47:51 -0400 Subject: [PATCH] first commit. Way too late. --- .hgignore | 8 + api.go | 140 +++++++ client/Gruntfile.coffee | 48 +++ client/bower.json | 21 + client/coffee/controllers/aboutCtrl.coffee | 5 + .../coffee/controllers/collectionsCtrl.coffee | 12 + .../coffee/controllers/databasesCtrl.coffee | 11 + client/coffee/controllers/documentCtrl.coffee | 24 ++ client/coffee/controllers/homeCtrl.coffee | 7 + client/coffee/controllers/serversCtrl.coffee | 10 + client/coffee/controllers/topBarCtrl.coffee | 18 + client/coffee/directives/key.coffee | 18 + client/coffee/directives/value.coffee | 18 + client/coffee/filters.coffee | 13 + client/coffee/vultureApp.coffee | 25 ++ client/css/RockSalt.ttf | Bin 0 -> 125136 bytes client/css/vulture.css | 4 + client/images/gopher.svg | 68 ++++ client/images/vulture.svg | 374 ++++++++++++++++++ client/index.html | 64 +++ client/package.json | 11 + client/partials/about.html | 35 ++ client/partials/collections.html | 17 + client/partials/databases.html | 17 + client/partials/directives/key.html | 10 + client/partials/directives/value.html | 12 + client/partials/document.html | 39 ++ client/partials/home.html | 1 + client/partials/servers.html | 17 + handlerWrapper.go | 24 ++ main.go | 89 +++++ main_test.go | 60 +++ params.yml | 16 + shared/mongo.go | 101 +++++ shared/mongo_test.go | 18 + 35 files changed, 1355 insertions(+) create mode 100644 .hgignore create mode 100644 api.go create mode 100644 client/Gruntfile.coffee create mode 100644 client/bower.json create mode 100644 client/coffee/controllers/aboutCtrl.coffee create mode 100644 client/coffee/controllers/collectionsCtrl.coffee create mode 100644 client/coffee/controllers/databasesCtrl.coffee create mode 100644 client/coffee/controllers/documentCtrl.coffee create mode 100644 client/coffee/controllers/homeCtrl.coffee create mode 100644 client/coffee/controllers/serversCtrl.coffee create mode 100644 client/coffee/controllers/topBarCtrl.coffee create mode 100644 client/coffee/directives/key.coffee create mode 100644 client/coffee/directives/value.coffee create mode 100644 client/coffee/filters.coffee create mode 100644 client/coffee/vultureApp.coffee create mode 100644 client/css/RockSalt.ttf create mode 100644 client/css/vulture.css create mode 100644 client/images/gopher.svg create mode 100644 client/images/vulture.svg create mode 100644 client/index.html create mode 100644 client/package.json create mode 100644 client/partials/about.html create mode 100644 client/partials/collections.html create mode 100644 client/partials/databases.html create mode 100644 client/partials/directives/key.html create mode 100644 client/partials/directives/value.html create mode 100644 client/partials/document.html create mode 100644 client/partials/home.html create mode 100644 client/partials/servers.html create mode 100644 handlerWrapper.go create mode 100644 main.go create mode 100644 main_test.go create mode 100644 params.yml create mode 100644 shared/mongo.go create mode 100644 shared/mongo_test.go diff --git a/.hgignore b/.hgignore new file mode 100644 index 0000000..e500613 --- /dev/null +++ b/.hgignore @@ -0,0 +1,8 @@ +syntax: glob +re:^client/bower_components/ +re:^client/node_modules/ +re:^client/js/ +re:^client/lib/ +re:^vulture$ +*.komodoproject +*.out diff --git a/api.go b/api.go new file mode 100644 index 0000000..9f6a8ef --- /dev/null +++ b/api.go @@ -0,0 +1,140 @@ +package main + +import ( + "bitbucket.org/damyot/vulture/shared" + "errors" + "github.com/gorilla/mux" + "labix.org/v2/mgo" + "net/http" + "strconv" +) + +type VultureBackend struct { + Client *mgo.Session + Db *mgo.Database + Collection *mgo.Collection +} + +func GetVultureBackend(req *http.Request) (*VultureBackend, error) { + vars := mux.Vars(req) + serverURL, ok := vars["server"] + if !ok { + return nil, errors.New("server field not specified") + } + client, err := shared.GetMongoClient(serverURL) + if err != nil { + return nil, err + } + vb := &VultureBackend{Client: client} + vb.setDatabaseCollection(req) + return vb, nil +} + +func (this *VultureBackend) setDatabaseCollection(req *http.Request) { + vars := mux.Vars(req) + database, ok := vars["database"] + if !ok { + return + } + this.Db = this.Client.DB(database) + collection, ok := vars["collection"] + if !ok { + return + } + this.Collection = this.Db.C(collection) + +} + +func (this *VultureBackend) GetDataBases() ([]string, error) { + return this.Client.DatabaseNames() +} + +func (this *VultureBackend) GetCollections() ([]string, error) { + if this.Db == nil { + return nil, errors.New("no database set") + } + return this.Db.CollectionNames() +} + +func (this *VultureBackend) getIndexes() (interface{}, error) { + idxs, err := this.Collection.Indexes() + if err != nil { + return nil, err + } + ret := make([]map[string]interface{}, len(idxs)) + for i, idx := range idxs { + ret[i] = map[string]interface{}{"name": idx.Name, "keys": idx.Key} + } + return ret, nil + +} + +func (this *VultureBackend) getMetaData(query *mgo.Query) (map[string]interface{}, error) { + meta := make(map[string]interface{}) + var err error + if meta["count"], err = query.Count(); err != nil { + return meta, err + } + if meta["indexes"], err = this.getIndexes(); err != nil { + return meta, err + } + + return meta, nil + +} + +func (this *VultureBackend) GetDocumentByIndex(index int) (map[string]interface{}, error) { + doc := make(map[string]interface{}) + query := this.Collection.Find(nil) + if err := query.Skip(index).One(&doc); err != nil { + return nil, err + } + return this.wrapDocumentWithMetadata(doc, query) +} + +func (this *VultureBackend) wrapDocumentWithMetadata(doc map[string]interface{}, query *mgo.Query) (map[string]interface{}, error) { + ret := make(map[string]interface{}) + var err error + ret["document"] = doc + if ret["meta"], err = this.getMetaData(query); err != nil { + return ret, err + } + return ret, nil +} + +func getAvailableServers(w http.ResponseWriter, request *http.Request) (interface{}, error) { + return params.MongoServers, nil +} + +func getAvailableDataBases(w http.ResponseWriter, request *http.Request) (interface{}, error) { + vb, err := GetVultureBackend(request) + if err != nil { + return nil, err + } + return vb.GetDataBases() +} + +func getAvailableCollections(w http.ResponseWriter, request *http.Request) (interface{}, error) { + vb, err := GetVultureBackend(request) + if err != nil { + return nil, err + } + return vb.GetCollections() +} + +func getDocumentByIndex(w http.ResponseWriter, request *http.Request) (interface{}, error) { + vb, err := GetVultureBackend(request) + if err != nil { + return nil, err + } + vars := mux.Vars(request) + indexAsString, ok := vars["index"] + if !ok { + return nil, errors.New("index field not specified") + } + index, err := strconv.Atoi(indexAsString) + if err != nil { + return nil, errors.New("index field is not an inteder ( " + indexAsString + ")") + } + return vb.GetDocumentByIndex(index) +} diff --git a/client/Gruntfile.coffee b/client/Gruntfile.coffee new file mode 100644 index 0000000..478a3a2 --- /dev/null +++ b/client/Gruntfile.coffee @@ -0,0 +1,48 @@ +module.exports = (grunt) -> + + # Project configuration. + grunt.initConfig( + packagekg: grunt.file.readJSON('package.json') + bower: + install: {} + + connect: + server: + options: + port: 4506 + base: '.' + keepalive: true + + clean: ["js"] + + coffee: + compile: + expand: true + cwd: 'coffee' + src: ['**/*.coffee'] + dest: 'js' + ext: '.js' + + watch: + coffee: + files: ['**/*.coffee'] + tasks: ['coffee'] + options: + spawn: false + + concurrent: + target: ['watch', 'connect'], + + ) + + # Plugins + grunt.loadNpmTasks('grunt-bower-task') + grunt.loadNpmTasks('grunt-contrib-connect') + grunt.loadNpmTasks('grunt-contrib-coffee') + grunt.loadNpmTasks('grunt-contrib-watch') + grunt.loadNpmTasks('grunt-concurrent') + grunt.loadNpmTasks('grunt-contrib-clean') + + # tasks + grunt.registerTask('default', ['bower:install', 'clean', 'coffee:compile']) + grunt.registerTask('dev', ['default', 'concurrent:target']) diff --git a/client/bower.json b/client/bower.json new file mode 100644 index 0000000..a4d0d07 --- /dev/null +++ b/client/bower.json @@ -0,0 +1,21 @@ +{ + "name": "vulture", + "version": "0.1", + "authors": [ + "didier.amyot " + ], + "description": "MongoDB Browser", + "main": "index.html", + "license": "MIT", + "private": true, + "dependencies": { + "underscore": "~1.6.0", + "foundation": "~5.2.1", + "angular": "~1.2.14", + "angular-route": "~1.2.14", + "angular-local-storage": "~0.0.1", + "qunit": "~1.14.0", + "zepto": "~1.1.3", + "fontawesome": "~4.0.3" + } +} diff --git a/client/coffee/controllers/aboutCtrl.coffee b/client/coffee/controllers/aboutCtrl.coffee new file mode 100644 index 0000000..712cd5d --- /dev/null +++ b/client/coffee/controllers/aboutCtrl.coffee @@ -0,0 +1,5 @@ +root = this; + +root.controllers.controller('aboutCtrl', ['$scope', ($scope) -> + +]) \ No newline at end of file diff --git a/client/coffee/controllers/collectionsCtrl.coffee b/client/coffee/controllers/collectionsCtrl.coffee new file mode 100644 index 0000000..47446be --- /dev/null +++ b/client/coffee/controllers/collectionsCtrl.coffee @@ -0,0 +1,12 @@ +root = this; + + +root.controllers.controller('collectionsCtrl', ['$scope', '$routeParams', '$http', ($scope, $routeParams, $http) -> + $scope.server = $routeParams.server + $scope.database = $routeParams.database + $scope.collections = [] + $http.get("/api/#{ $routeParams.server }/#{ $routeParams.database }/collections").then((res) -> + $scope.collections = res.data + ) + +]) \ No newline at end of file diff --git a/client/coffee/controllers/databasesCtrl.coffee b/client/coffee/controllers/databasesCtrl.coffee new file mode 100644 index 0000000..4d17a9e --- /dev/null +++ b/client/coffee/controllers/databasesCtrl.coffee @@ -0,0 +1,11 @@ +root = this; + + +root.controllers.controller('databasesCtrl', ['$scope', '$routeParams', '$http', ($scope, $routeParams, $http) -> + $scope.server = $routeParams.server + $scope.databases = [] + $http.get("/api/#{ $routeParams.server }/databases").then((res) -> + $scope.databases = res.data + ) + +]) \ No newline at end of file diff --git a/client/coffee/controllers/documentCtrl.coffee b/client/coffee/controllers/documentCtrl.coffee new file mode 100644 index 0000000..20df927 --- /dev/null +++ b/client/coffee/controllers/documentCtrl.coffee @@ -0,0 +1,24 @@ +root = this; + + +root.controllers.controller('documentCtrl', ['$scope', '$routeParams', '$http', ($scope, $routeParams, $http) -> + $scope.idx = $routeParams.idx + $scope.doc = {} + $scope.idx = Number($routeParams.idx) + $scope.meta = {} + $http.get("/api/#{ $routeParams.server }/#{ $routeParams.database }/#{ $routeParams.collection }/idx/#{$routeParams.idx - 1}").then((res) -> + $scope.doc = res.data.document + $scope.meta = res.data.meta + ) + + $scope.previousDocumentUrl = () -> + "#/#{ $routeParams.server }/#{ $routeParams.database }/#{ $routeParams.collection }/idx/#{$scope.idx - 1}" + + $scope.nextDocumentUrl = () -> + "#/#{ $routeParams.server }/#{ $routeParams.database }/#{ $routeParams.collection }/idx/#{$scope.idx + 1}" + + $scope.hasPreviousDocument = () -> + $scope.idx > 1 + + +]) \ No newline at end of file diff --git a/client/coffee/controllers/homeCtrl.coffee b/client/coffee/controllers/homeCtrl.coffee new file mode 100644 index 0000000..5f909fd --- /dev/null +++ b/client/coffee/controllers/homeCtrl.coffee @@ -0,0 +1,7 @@ +root = this; + + +root.controllers.controller('homeCtrl', ['$scope', ($scope) -> + + +]) \ No newline at end of file diff --git a/client/coffee/controllers/serversCtrl.coffee b/client/coffee/controllers/serversCtrl.coffee new file mode 100644 index 0000000..34f0a7f --- /dev/null +++ b/client/coffee/controllers/serversCtrl.coffee @@ -0,0 +1,10 @@ +root = this; + + +root.controllers.controller('serversCtrl', ['$scope', '$http', ($scope, $http) -> + $scope.servers = [] + $http.get("/api/servers").then((res) -> + $scope.servers = res.data + ) + +]) \ No newline at end of file diff --git a/client/coffee/controllers/topBarCtrl.coffee b/client/coffee/controllers/topBarCtrl.coffee new file mode 100644 index 0000000..4fe1719 --- /dev/null +++ b/client/coffee/controllers/topBarCtrl.coffee @@ -0,0 +1,18 @@ +root = this; + +root.controllers.controller('topBarCtrl', ['$scope', '$location', ($scope, $location) -> + $scope.$on('$routeChangeSuccess', (next, current) -> + $scope.path = _.filter($location.path().split("/"), (s) -> s) + $scope.getHistoryUrl = (idx) -> + ret = "#/" + ($scope.path[i] for i in [0...idx]).join("/") + if $scope.path[idx] == "idx" + return "" + if idx == 0 + ret += "servers" + else if idx == 1 + ret += "/databases" + else if idx == 2 + ret += "/collections" + return ret + ) + ]) \ No newline at end of file diff --git a/client/coffee/directives/key.coffee b/client/coffee/directives/key.coffee new file mode 100644 index 0000000..8f235b2 --- /dev/null +++ b/client/coffee/directives/key.coffee @@ -0,0 +1,18 @@ + +directive = () -> + directive = + templateUrl: "/partials/directives/key.html" + replace: true, + transclude: false, + restrict: 'E', + scope: + value: "=" + controller:["$scope", ($scope) -> + $scope.hasIndexDown = false + $scope.hasIndexUp = false + $scope.hasIndex = false + $scope.has2DIndexUp = false + ] + return directive + +directives.directive( "vulKey", [directive]) diff --git a/client/coffee/directives/value.coffee b/client/coffee/directives/value.coffee new file mode 100644 index 0000000..f176065 --- /dev/null +++ b/client/coffee/directives/value.coffee @@ -0,0 +1,18 @@ + +directive = () -> + directive = + templateUrl: "/partials/directives/value.html" + replace: true, + transclude: false, + restrict: 'E', + scope: + value: "=" + controller:["$scope", ($scope) -> + $scope.isString = _.isString($scope.value) + $scope.isNumber = _.isNumber($scope.value) + $scope.isObject = _.isObject($scope.value) + $scope.isArray = _.isArray($scope.value) + ] + return directive + +directives.directive( "vulValue", [directive]) diff --git a/client/coffee/filters.coffee b/client/coffee/filters.coffee new file mode 100644 index 0000000..7571d2c --- /dev/null +++ b/client/coffee/filters.coffee @@ -0,0 +1,13 @@ +root = this; + +root.filters.filter 'escape', () -> + return window.escape; + + +root.filters.filter 'replaceAllCommasBySpaces', () -> + return (text) -> + return text.replace(new RegExp(",","g"), " ") + +root.filters.filter 'niceJSON', () -> + return (obj) -> + return JSON.stringify(obj, null, 4); diff --git a/client/coffee/vultureApp.coffee b/client/coffee/vultureApp.coffee new file mode 100644 index 0000000..98bdc15 --- /dev/null +++ b/client/coffee/vultureApp.coffee @@ -0,0 +1,25 @@ + +root = this; + +angular.module('vulture', [ + 'ngRoute' + 'vulture.filters' + 'vulture.services' + 'vulture.directives' + 'vulture.controllers' +]). +config(['$routeProvider', ($routeProvider) -> + $routeProvider.when('/servers', {templateUrl: 'partials/servers.html', controller: 'serversCtrl'}) + $routeProvider.when('/about', {templateUrl: 'partials/about.html', controller: 'aboutCtrl'}) + $routeProvider.when('/:server/databases', {templateUrl: 'partials/databases.html', controller: 'databasesCtrl'}) + $routeProvider.when('/:server/:database/collections', {templateUrl: 'partials/collections.html', controller: 'collectionsCtrl'}) + $routeProvider.when('/:server/:database/:collection/idx/:idx', {templateUrl: 'partials/document.html', controller: 'documentCtrl'}) + + $routeProvider.otherwise({redirectTo: '/servers'}) +]) + +root.filters = angular.module('vulture.filters', []) +root.services = angular.module('vulture.services', []) +root.directives = angular.module('vulture.directives', []) +root.controllers = angular.module('vulture.controllers', []) + diff --git a/client/css/RockSalt.ttf b/client/css/RockSalt.ttf new file mode 100644 index 0000000000000000000000000000000000000000..88df5cdc94bfd9bc59b7aa0ae939f95eba19a626 GIT binary patch literal 125136 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⋘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

=-o1d_< z2nUY<4=*RPpt7K(wgSH(KRY9{02{xO2!{YWw>X!Co)jZD7ZWEh4-W@3n=qreswk_N zqy#%Z=!kx14rV4$Ux`gjT%3c2jfF>8K!B5#hlP=mQHxKERYXNuNr;hyiI;~}U6hfH ziC;lpnv;=TSX!1FG)TlE%q_wtZzU(j&CJZg#m>si%ETqe#=$5mFRvud#3U)rBP1`% z4?fnBje|pgmy=OcPJ&06iBABuepY~$nH{t$h>2H;PZneXs}N}66o&*i2S2|67q1}b zvJ_C4OGQXjke!vAMTA*YgPV(wkB<{H=F7+^Aj8GN%)%hgb3_pNCA(Mg3dVtpJT=P zhCvN{UKKk-=>K-6LijmW<#6#E|Jy<5EKW(LiFLF@}yni$V9 z`7rr|_biKo))|5h{{yu=LGuKlQW7M_#{$YxqI`_7ixEMkF{CmS2PJi8(7-CFR^?*? zZSn)HL5!hssMG< zK!Y|Q1Ho%(zzlY1mIl||rY3Blg}UH#YRy2$6GE26fS0krb15^sI-5AyB_IR9!%Cou zK{a)dNot^Dkl}e0+$aF;F96p#pw)n&zMZKWXbBBy4g}N&kYfVX8lV9lP}>^B2DiGv zi#I_T9&|FQ9C$)dj*%Ta^kXIl_N*9ay`iy@nYx)hqY-Fq87cq{MDS_u;LHAu#Y7oF ztA1=jo1Z}wm*$|;Q9#q5pn8&BOhg>Cz!Y{(DYH4mXQ03WT~PxHFi|nknjKL461*N* zj#*p;w2l)r1q0fl2#!9G2O%qoK)n?^MssCx_63YA0<3~;9761Tl9H1AoHDXfoMIa4 zn&NB%f&!p@_KZ3XKF&t0+~6yL7-h|5`DFRT)zoxkIVE^G*#vb(*(G?mBqYQ*`GmMR zL0x`MMr8+kMi(6PFTUWM&nTkd&9;=Hd`E7M76Y=i-*L6K7&( zW#nX5*VAC($ZedWEy^w|BErQj&Lg6wuFL~E?t+<>Rg^=3--3~m#g$WtgB5i5 zJS#KkNIq^(4sLEH(D}>kp!+8oS%qX3<;9sbg4Ogzbi}1OL_nK9*aZc6SvdHZx%rv6 zLEE}m*f|*aM8vq*xi~o4M5M%-LFGGW1cM!PA|xvZ7b7=6BO^B-AG2CQdYX=)imHl` zsG=w%ql~7$5QmTeHxu}nct#-^B{^{xM$o(!HxmmZld!fZqXZi}H;*7MhY%MRD;uY( z2qPDhsEUfJC<_k{6AuR~509`Im#C&FD<=y(BP+YAjwUxhhcFkX04oO@2fv1ZUZgHF zpPV48I6oV|kg%Z;D=Ql(I}1Ax6CWo#Hy;Z(J16KIN)|3Q7ItPv4nbydAs%KyMkY={ zCT_XCNTKr6$qKq6e%8D%9 zvOHXTOtMz8JUpBt+&tpkESwx{{1S5fpk}1F-~@7K2RP5 zO?HD15RwvMVrAvwWMgIfyGBEmiG!6*jEkR9T!D{AQjVF4i&dD1m7k46n3F@EO_+N-0U12Ov3C6P711^1HAab=jn2C@Gxmh zbMta>vU7-V^2;cwinB4ZvoHz^2*^lT?P3D;h41{I#n=Y>KAj!dL&S9%^Wm(&jy-u z1eL6yb&#Ms3sPn>f=Wx!A*!JMHs~fi(6SUzwFas`plAFrva^YR&ap594YZ4Z&&@H1 zYJnE2APdbv6&gEaejQo?DeEzU4*XFwG>2ZqWM(R?4yuGehwy>i02)*R`4ss!P)PrW zS>23Df`gwOe(@(eD;G2L=1*mQSt&jyP9YmrRwfQkCKd3tpHiUVJ}xm)F>XOA4mmDS zSs7(%Hg;AX30^UASsPg?6DdwkK5L z96yh#l`$8uG#?wMFguTgu8yuG6X;9>J{f6gepW$tW=0k^CLU%^5d{f;84h+%HdfH? zE_NPXZZS4iE>>1f(9%aS9vOLlUMX%lV`&~f9!VZnekOSxIZ!VLv=)+)UsMp|9#RDZ z8KhfC#jLE1`S~Tl1C%TrXSjs8;J1x}1{7JD`T5w@ef5wB55>XPje>>_+1Qv_M7hOe zMc4%e_?Q`4S(w0s+o0y804M0U3|3a~+CpwN9szz~K|X0-88Id%X3$tT2PbHu6b}c# zG!L&JFDDad^%N+7aY{)`u(L9AaEfpV>#9le@G&w8hzK+DNps3_3-N)rWphjOXiFOD zf`(Q&<@i8798M-h0}Cn8edsJ)qTB-V0*pSOUL^X>r?8<)_`Rnnqnw}%PeEtKUSg7G ztOT843AzFTw0MJ$ncWoJtN{&Z=re+u;C2ppJrrnL1)D4*sKo%DQG+ytz$*vA>jXi| z^gzuVGd0lABxsfiBw`Fo{!H@hpu<$TB_+kVSUEs9et@n(o1az<~BO4PdXmW^^m6exCL{@~2g;_)pbpAgJ6EhPd zA1@PV1r;X~BQv9j0_grE27ZQ1%=V0x4A~3}pm2dMe1V4xXy6?*sDllmz;|yFHByBFm!o)=cwxEbDkU$BCiHQ{&NLqi9mH?>t%gxBj=-|sI&C4z<#3R7P#>Kd)wbPHF>r8Z^=ct|Y|RAwkT? z$PO8{Wwd34?d21P%qxM@8$tu)C$KNUA;QB4_9i?$q|~{=0Rjm;MjlqyM?BCV;p2fS ziEwiWfJPrdf#IXd%*o2m&Bo8c!NJYN%4F{k3OEq~9)8gBRZz%rg0@;R zFoM&TG&pTR&ctG5Cn;r-nodZMeFjEwdbEg(*~3 z8K|`eUUbEBhK-+5+FX{I1++_?gN+N+To=&^GME?F} z2Hp9|C&I}h#KFqJ#L3Ob#wX4vAj${o9WXMpvx_it3dxEw%W^XcF|x2RGO;qVFtTuS zv4c(%VPR)sV_{`y=i_7SVd4?s=VoJNWMW}qWMX6lt#sf3HISHCn7P>)S-2P(nOK+^ zSq0cYBlDoUxfxkGL8DxZOrSIVI9Zt4n7Bdbz6pWW!83BPa5Ay5fYwv8vvF}V@o_Q< zvJ0{>vam3NuA}5*WfhRVz{4rXA z-WWVP3trG|#|)~h%pr%?8XJi*J!EF*W#eLG<>6pq5|k8|5MUD(7h`8-WoBU!HKf_-qRL82BCPCe`k`7HBBHE(93skmCQ0Tjq7sszZKtYs!t9KU92~5? z!a}0_Y#bac9K6DULVO(JtSqeTpcUX80<5yiV*GNf9DHnoviu6pYHUorpxdDtxtYPI z(SRJz2f6`OP(xEgfKOaZf)8}|11so0HzqzoUPcyX(9k>sFc%IP-v|!`H4n`+|os8VzZl2$T9gN%pI~dvSIC3(?FtRb^FtRb! zFtRc9FtRbQ#O`1SzOaK4bi3td2F5RroD6{sn;8-rHZv45Y-VU=*bG*ZcVP!Zi@;8X zez1v~1$Ho8zTn8rV9Icrfic#Ro56wMGD85vWrhTX%M1k!ml+xuE;F#kf{fk4a2smB z3fNUU7_~3#V2}~m$ruRfW`b5;fy+x!Sp`aRjNl8TLB*#!xKM=*<%8Oh%%J06z(bMt zjAo{wMWf*3zd%)nIp|78b?_Ny;2rs(W4OSbRM0ADP{{~Nfy|(?60|D;v|t1_{RHog zLUIFWYDwu;GQg)4Qgzdfp#&2H}8Pfkb#^b0avaoWg|1@*m%X4&s07vu@e9ZRNS6Y154N!!Gk6LVR4;%R z$U+Q*Jo-k-b8XvbX zHx~=HB#)rHfVc=7s3FVDDafVfqh^w7#3Ufd!Ntlgs3@rEuf`$Dt{`tGt|1~QBx5GU zr6n#Zplx6v$|c4vtH8>}%F4#a#x26dE6$_npdh3u#4gCs#{xQdj8l+9!c>w&OjAoo zoRycGqnV$Zg_WH{R7{u^bd)s{6Q3*xXsa+IBO|CACMCqo$;!gdCS`5F#LUhO>aQzH za&ob7fR>9fGI6l6a`LdVGO_W3&WK=UV`FAx<&)%NWMSgsWEW;+PJVU~ zApvG~ZeBh}pYi`rCK>QNHn`6S$@QS|9#G3kj#-=5Nxlu7~=-en3 zrYWVQh@7Sb-TCoGIR6sGqdnX@k#UY zG4TqpFfy?Uiwp4Z2*?WXgGQ^^IT*L{OG`=dfpUnkQyH&4;vdh zM(0(Si-Vg7v=vA_R98?zfKwdQ@kexCL2C&97yf(1XvxsQV8W0AUPBNKKK*A01GoMT z1_yluL&W4hsLoWUv^#GHJ}VS79ViCgD+214iHI>;V(T-4&Wn^%<6-6CWMf5i(jW3L zv9Pd;cxdzR@(F@Y3}fPBWMN@rg$|k^se}dyymv_;IM}#ZK{qNJd#f>Xf-WQw;9%$A z=4NG5a90C&<^_2KxR_Wtc{w-)xj>zHHU|EGzu2mnbs2szIx_Y!9%TH+qzB#?5Uam~ zQB;2i!(sj1j3*cv86hX>PiA0bYzD9YpT)q)Bo1cXU|?jZ2D2VBFfx>ZSuYqE8S+4L z0F1E$I~mu5nsSVy0y`O>fLIKN1$HvAgPUZGkY()R(9#5Qj0Ic89g8MF=GL*ZaIMl|3MiC-r57V{Xmn?a*X1vXom1Hkz)$G zi5h5yGB~8!K@;|%_ASW&vWRuepcSQdjK+50^L{|`%U$`9`-vd9PI4inRR&{c`GSFPSCa2{EEDSih|OHpovvZ zNzfr&ETWR)?3~=(9Ly{%0%Ck@Y=Uw^9DN{8G}={7md@oWdfaT~Mgq{_+xTGqo1x~X1>hh12J zhlPV_JC~${Fbil)yK1m1=*ng-4Rt{&Jsmx1R%v|$69pbNR&Eh~P9ZKv4n}S^77igc zegy>ueok>I32s(aW=6vhJr*8TUT!gNF+Nsd5g}#)5n)k5W@bJqNofH_c4p93p^&3d zS-3%Gb+hp@vI{5(aPYBnv#_!Au<2sp}$82 z6a=`%xHx(F1bH~6`IJPM*!UQ^Ihc6GWUb`HHN=_NnT4grB?Lk9B7CfZ%p9WZj9em2 zQbHV}Z2ahYLAM&P6RVqxiItg?7qp5KH0CS7!6(4MD$c?o%p@SMpdiS>#KpwK&BMvW z$_-k}#l*)i?j%RD4#v66pc775Sva})IGI7W5eSHiaI1+hu`@}V%4qPhaImw2&P`Hf-Jj4oWZ`pyzsOB;hGHU++|3Bk@6H_9q zFM}EbMEv^y42E_8|No!!zln*Pl?N_9@BbV|`Tzg_oBnTN^kHKFiOYlT7!3Vy$^^Pg zQ1gF1ix}%W_!_LaOothL{=@DD{0JAn&hVHq2qw;E3>Ob&Ok>*dA9iQpD+bt|fpZx( z89kul@oeF6@#_p}j3D*$pgRWHMB(D04Dw8~7#JBC7;+hIGu1QLf!l1l`a2ld^$iTo zL46+37Fh7nA)vYkbUPI2&ID5vHGM|VOtm_ANCRA8i_0;Jh>076M?8$>7;l4)%n=aa zW#-`IVr3ST;{)yQU}t1v;oxCpVQ1oH5eZj}d(N1ayv_SzQSW*1;(lo96=7v*ObQ&ZQGWfPN<;9z88W@Te%<`)rW zXXoZ%1RXylpvVhaY{bvP$t1QKY8rvID>8#t z+=1E$h}IUfxfo=(q&aAz9B6Dyj?r8MvQQ4(_5lT=7;_Q_7Z(#V3utpN4>yx#zBwBU z2OkF;3y+M1Ff$hy8#|kfwz`^xoR_OG1~&_vln&?;3m#?x85tP?HcnPf zUT#iq(8;k(?D8_s^^Uv}oJ`E8xdr(6xfq!lK?gjr3o45hTEZi!*U^a)Hi7 zVPH08s$~Ai;0oSttjEB}AP-Jm<_wGsJdo7I#|%33gO3T+IOJmlhZA_sBO7QzFlfsL zXhSJ@U=G{{HB$qhTL{`mY-VgED#yrF$;{2e&CDSvE(uzc#LaA3Xu$BZ3PR52=jJU7G_o!VIe*q&@p?=OsuRN zynIX?Y|Koo0$j|j90D=|-0WPepzYP%985f{pczDFCRSNkoI~S}C|F;LJlL=({M1kmzANsmccjUD7^b0a&*%qIB!M9>mvBQbL^ zJ0@{Z%TiUM?X{(3MNPe7x-3GHgtYpj{DMqMW?aGSa+)`uq}-LPDVY2fAvQiHV1a8MLE> znVDaJmx-N6KuStMf{BHdOH!RBmrGn!fJt0kT}OsZSX7LIk)4T&jg5_&k&%U+os)xu zk(-@^ot>494U|u$ScJudWtas(C*gvQJ!EI&U{+L-WfYJVVdoVT7hnfX{4q0ggU%b~ z0y&n2jY---M_ZI#5FF5;GE1Lf2{Y)tS8j$~3@Qw~;F&vNQcieXLfnC^#GSwjI)m1h zS%Yal%P|ILhAIYOhFuIv4B`yT+PfI67<|C411+EcRSb|OJ2PmC5WKA#G;0VdO&MWz z0=Sz3?h%331T(_c#)`3^$Q9{Gg*$SUI>jxP_S2Ts1_LML5~G8JW1bB&B6| zwL+CyJ=ho}&81|8Ic0bRd4)6txdnMR1-YbTxJ5WwSwL%lq~+v5cZIUDa&z!W@Chml zGO{zWh{>4Ch)Z!Wu`n@lfsV)I-~in;$HcUOd!y&=J#>*zd$Ii{n&dI^f%E1TP;K0hu%*q7X zG0*UK2@@+rAVV{Fmm%mj(Fz7e25(Sbm_bfpCxafO-wW!7f=ALIaR3f_&}0N;uM)Tf z2KPomWiF^L2K5m^)fae5%$`w?8L|`_6kDK`&Y&$Zpq?=_p1^aukhRL7J~6nA0xwqs zZA)Ne0^Q*yEFsRxE5|1wE65?p#lp$TBg4lj#>y_JD9FpnA;=*j&c`9h!66J(pA%1ZYQ9gD-Rz7}t0U2&4CRPqU4ki&U zMs_FA!B5OA9H2cHIsxjeY-}97{EVzjLd?QqV(d(eOni(yd@SssbIU+W_gH0kd4&Xo zcvyK^c_gJII2oB(*m&55IM~7C(hUC|F+6AJU@&H2XV}5O1|N$AwOkk>l@xf)2Q&u^ zIS(6>{^c0OK}$Em4HePnjEvlZe7ro`9wMxu)(R^tH=nAourO$y5(f*nniP1Fg^`bm z=_5NYI|moDUX(456b~mmFS7s#w+I&(KQ}wCFrTP6r+|W>Zm2pF8zV0dHwPD}?TylI z1>L7+1a41cFfcN(f?3g^osMYrF0=pzwY>Bg)nSz`qdNGsO;8p`uX7pA!S|Lyt6e!p zaIGr_x=z&`ywd`-55P!_30mpu>1y)w3GxYmZY|^j^#O&X#KaMGu7sWx7pD+A7YFEE z0;Kv@%0dcs{H+KFa)XzNiIp347#IsXk7AqwmWmeK8f9hy)wBE}BA|MflZl(1LqL(2 zg_(^RG;hv`TFbIYGIOx;u<>%Si_0hquz_2vKI0rVed1~89+B!?O=!p@BC*3wba-^yKq6fus}1Qpg}C~#4c!d0y3kitfbB+25!cI zm&rgEN$N3y(ha2V1Dd&I#J(Dk=_D6F=)M$w1w{ou9&RonZdML1ZVpyq4sKyi0T}^4 zNnRFSHeNO^Ru)D^enCDdUUoiE1B0E78?^e7jgik(jGLRot=COlPn?;Fk(q^?gM(cd z)Sh7iEfisAVdj(tuLWdeg0GllXJ=sqmB2XH0y48BEt$l!6p)F5@Bb&JE6geks~D~^ zI5O;D2-e@h(4-GOTb3#$M#H|Vf#R(3u{0TFItZeAJ4X+gXa(9?o=g(YPKB*aAd zxWq(-zp`&NiI~GI8PJR&7f|AguP!~a$+5-eH_4;XtHycu>dY}4Pt zP^7<`5wwHgA2{VjGB7g6g4<621a>emT-d=_D6oS;@4^noSb-f3<`;G_Y!leYCiXwd_>V1+3KZ}Sp?q&rXw z1*Lj3b2CxMC<3@?1xlWvWD430%_as~LIGOvDa#02d7{L}1e%Ee%}78_L(*deEysmc z0iZ$%x)>MK@-_q2W9Dl5jCP=fq@WEFpqU470S7A3;3b?kC_jpV&oTiGxZ+}&jz|HjR`a_#>&Jk$}J!#$Sujq!YLvq%Eivj!6pJ) zyU!`d%>r6`&MPb+$j!*k#Kz6a&MvQKCIQmS#wjBw$HisV9>~Pb#KX_W&&@Bx2f9Oy zpO2lDLxf$B1+=}3i3K#C#m2%o7pa5?T^BCI4O&?TD&kp~nYcjLUa&AT^YSa0$*{|S z7QpMMc`0xSae&rMak2>TiK~e*f%a9iu#18w09aW>SVc7XRJ_#KxLG*`IXJmQ^bPcc zSV0%{fZ9=Pj9lPN2yDzuj6AS9fs2C^sZL;HVd0czoX^P23c3LlvJ4zF48qDNEGNv& z&LS+x!OjY*H(3Rh1#L>K+1Obb`9uVG*;vJSSXek@WJOpcWI6Z+7#W47+1S~bI9NfW zPt2hEwpck>8JXCaIGI7WesVIiGjoXXv9ob-ib+avadL67@pEwSfbQqBOo#|GVB=&L zQ&&|J^Q$pr<6vhK77+$5ab#p<;$`HM733A;k_IYhNY*jTxQbtMcW zBN#crN8xgCa)3@5Wny7tX5?VyWR>HU;NukL;$l_yP*!wQaf>suv2pWo^74WxCW9G+AA<;k8N(h15e9Px%m3FI%o(izzhN*3t1)MA0<)d}e`7Fba0SbH zfJxu~4;joE{QjS1FlR^yvopc$Y%n_y%+3ds6=1!)!R$T%&oWpr`2By#V8O8G|3d~# z28;i17%UlVz$C~nO9r?9I~Xj%YAhN289W#)8Op%2AoW%Z=KtR?Sb<$-#o+S)A%hiz z8<_M3i&ui#8^PoSFnJM7Ui$x#!G^)||2hU62G{>P80^93*fUuCf5>1Dw%wk=@&6kJ zd$7s&3@%`{7nn>3lVxC)m0f{r`r+k-_u-VFpKrJTQCr z|2GUyV0)dw<~uRCfkh&~WcvSa3{DIn^PLzP!6G1AoESj1I5B{1abf`3;>=+7{|$pP zgZcl549;MeJA>Wq%;56>8-p`AG@Kc{z-&;MI5U)h)t7?FO0f8PFna@-+z1vq4rZSO zlNZ1u7s2EuFnJkFUICL=|9@j}VKDpukiiA)7Z;;p3V6q=fZUn1519rn%FnJD4o(Gc`z_J&?;E?lZVYb!4>PzifYP2D11R*|7<~VKV{l^#1Iw0x zO(+GEpfGe}0Qty`p&Be(114+1WF45S2a^q8ay?kr1~3V7xf{cAF#9B!1i99Y0pwaY z28e4x>Di3|l%CxfK>^lzz*Z&V0JQzIw_cM4fc>X`j-~slF2ZJA2&7S{n7(Br#)|0^-q=LbZ!Ir_3 zVGn~XgBLiIycq2NA7=0Zr)@6=Q0nz!0Hs(j22d*XVgRL5F9uL5^=5GTf1Sab!R7y9 z25)fM^Jb_7vp0gt3t;jhn7s7=FoO@+Odkff|KAvVz$W{EP4)qs>;pF02W+x0gZcln z48Gt}(HETRd>QP)BB1ih7aVuK;JEVz+v^L?eZCB!+~*699bX1eX!|mNLf97^!oJ`T z_GJL&EMEpt&hljd3uVe6MaQQF7;LqUp?;)sc{cp_R4~`dqhH|i)O0euk zFnIzjatchI29p=S;upc>rT-!fVGN+MF^mCJ@`o{iO8zj0{Qut=A{i3?e`81h=e`7R z4oYAE<)8!xP!3990Og%b zgCT_>_y0GB6ozUry9P|wg2_5CSq~-~{_kK&WeEGfgdr82-%}Z?!R#6^SqmoXz+^p` zZ1}%~A&nvI|3ii}uxry8s=@3UFj)&G>%e3^m~8m}kRhER4NRv0Kg*ELkO5|A{(r-e z0j>cvz~PVq4u=eInV-Rs|NkLF1_P+%&jj0*$&mK{4MQf_u1p4yU6~9ZyD}L-c4abv z?8;;S*_91epUsf+{~JR#Sba8FeKuHqHduW&Sba8BeK%NT518x)lYL;a|Nl3J9I$CQ zU~_W7=H!6Q$pM>_12!iIY)&pX)^fqImJ5!xTyU)Af@3Wg9BX-C)AGQk<$+Dh1Dloy zHZ2cqS{~T6d~j);&j2cK^BF+pZ9W62yv=6-mACl}pz=1K0aV_WfZH1-;5JDKxJ^Q8~yp8~5t1y+9wto}4u_B2@b zG+6dDSoSnn_5#>17r<&RfcT^GT+E`oJk z1nas8)^!oA>mpd!MX;_*U|pBMx-NlrT>|U61lDy4tm_h3*Cnv7OJH4>!RjxA>%Pn2 zbbAFXas@1M1uSwEEOHerauqDXz@W^y3e?sI4LC4(Kt__mBqxIhRGf){ogom)W@gZ2 zh=8(L7&sXkp=?$LUWP6xn~i}3bowaRM0N&ChWSu&4h9(p&{{~41SbP4!xyMH7lQ}G zPbiz4L4^@CHVjh3!ywL>3Ki#N&||EDviTUa;BFRR;AFf46&GY+XS@q#3o&pqK4D;H zU}WKBU|^WQ_!i1$WDsJig|e9#_?Y^kY-WZarnyiy3xg2TdnlWgL5i6X%4TB_V3vlm z*%^wMwV`Yd1`B4GUQPxs=BrR~E`|xr_n~ZV1`n2eD4T~tk7YZQ&C3wO@)XMEV+dh& zgt7$~gjlCS*@6swtjnGA3o45;(=$pGG?FzHj0_A76p|_x-175E6kIa%Qj2sHJoAzj zT$~&gf-_T6i!<`e^%NX)aumRNiWQ1di&KlrQd9JT@{_X_f)jH}f>P5ko~xP5L{TAnL;g(XOxr_Sn2DRmzV3M<>!?o73CM}CFker7sG<9Afo_DO)<#s z#G(?A8lTMM)V$)<6ot~fl++@Hl8jUZ$AZMl2pkPJx#tJ2FaO4rYU zm{F|nf? z7%&(z7%(U>Br#MnC@{D&>@IAW@j_Fl`J2`>dED6YO6F z215ot1_LmJsSRd;xeeX53JjSHAfF{NC@_>T6fq=%Ln0UKc95^~8PX^UNpj;Ln4yrN z6dW&uEygn#N*GEQ3K*;y^cnOS%E3^NAq^b%B@9UnMGW~2#o!Bk^BHm(^cg_$f||Mt z7%~_@7@Il8aDRhRPYK){ABIeZWQJ6RJceR$%2Qw{Wyk}^RS`JmG8j_9skVS2ks+A@ z!b8;qO8Mw1#R!~Iu=^;H0b!ONLq0A|#oEcmh{1}26Tp4s3 zAZEf+9w>Lg(jIcY0L`m|sTvJ7$z@(cI@nTnhaVD+6+1j zx(s>@`rrb^h{2e_gu#@-jKQ42g29r(iou$}hQXG>j=`S6fx(f%iNTq{g~64^%e3|$P}4806}3=F2g*A1q=%r7BMVlSi-Q9 zVHLw_Mka=}4C@%yGi+ek$gqiFGs6~!tqj{3wlnNt*u}7$VGkoS!#;-n3`2Qc=o?*;R zEdq&w*X1!VGO&Qt6(a)&10yFJSfv}oG=>!n?-+hCN-?@H`Y}#nT*P>RNsFn0=^t|g z^EBo?%;%Utun4gjuvD>ZVfn-gy8lgu)rvKSwT^WG>n7GStnb)V*qqp6*s9oOuq|WT z!nTX;0^28c33e@Z8+JeT1ok5K7WO{&8SIPL*RXG6Kf->A{RjI$4jv9E4g(H5ju4J4 zjtLywIPP$~;`qV90&aVQMv6h>#Gp}PLGUQCHE5Lc|3h#a8#Fo$8XE?U41;<{piyDa zm@sHu05mE98Vv@G1y}t4#sC@z28{wUf%|fxF*Y2leJbefj$T*TMaGP)LBrOhMy4pwS-CSPy8V2Q*Fv8Ycyfl7hxa zK_jG~kt)!5BWScy0X#Me@)Kwz88j*i9@7PlTY^Ra|GxqEk3b`#pm9*pC@5$Q6yi6K zYu+$`#y&wKpP+G1(5NS9%o8-?2^#MN*$x`(1dVhe+ln05tl-g2(AXwuWD_*52^!Vp z1dk+u#xz0h0*`0@?+1^Wf!qQb#{`XHvVh|iG=>Qp!32$8a)8qcX!H^^E)R-fP|PC7 zC6;?9y%zzL3s-_-Uu3P1nB~eG=jz%LAsAK*fM}d7?Dlk z2ahe<|6d0lR|JhJdi*yAhYn~w5j2_z8cPI?B!b2fL8FMEF+|V^B53@O1w5JoD zK;wAqU|qO$;0`zZ`arUvJaipALWiECnNey0R30O^6lVpebx7)a2+j$h(v5>)`Nv6A zIfj`^XeYu1Pf5hGP{RY2N1Xo{!Ewrrk_S=E!5+TEsKKt2ICoJ~6*D-6z)C}WJWxBz zjKPY5fx(8shJlsAp241hjlq$@pMjkrj3JCcj3JUCl0h8Y4wYa?VaQ~VV#sF52X`qd s8B`gn85$V08M+zz84MZLGi+oq1GNqrEE$e7oMy0QxWI6g!GVDR0ISU6f&c&j literal 0 HcmV?d00001 diff --git a/client/css/vulture.css b/client/css/vulture.css new file mode 100644 index 0000000..3c69391 --- /dev/null +++ b/client/css/vulture.css @@ -0,0 +1,4 @@ +@font-face { + font-family: 'Rock Salt'; + src: URL('RockSalt.ttf') format ('ttf'); +} \ No newline at end of file diff --git a/client/images/gopher.svg b/client/images/gopher.svg new file mode 100644 index 0000000..171ecec --- /dev/null +++ b/client/images/gopher.svg @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/client/images/vulture.svg b/client/images/vulture.svg new file mode 100644 index 0000000..4d7c55d --- /dev/null +++ b/client/images/vulture.svg @@ -0,0 +1,374 @@ + + + +image/svg+xml \ No newline at end of file diff --git a/client/index.html b/client/index.html new file mode 100644 index 0000000..f8c666c --- /dev/null +++ b/client/index.html @@ -0,0 +1,64 @@ + + + + + + + vulture + + + + + + + + + + + + + + +

+
+

+ Vulture

+
+
+
+
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/client/package.json b/client/package.json new file mode 100644 index 0000000..ad059c5 --- /dev/null +++ b/client/package.json @@ -0,0 +1,11 @@ +{ + "devDependencies": { + "grunt": "^0.4.4", + "grunt-bower-task": "^0.3.4", + "grunt-contrib-connect": "^0.7.1", + "grunt-contrib-coffee": "^0.10.1", + "grunt-contrib-watch": "^0.6.1", + "grunt-concurrent": "^0.5.0", + "grunt-contrib-clean": "^0.5.0" + } +} diff --git a/client/partials/about.html b/client/partials/about.html new file mode 100644 index 0000000..1523aec --- /dev/null +++ b/client/partials/about.html @@ -0,0 +1,35 @@ +
+
+

+ Many thanks for using Vulture. For all questions, remarks, + bugs, please use bitbucket. +

+
+
+ +
+
+ +
+ +
+ +
+
+

+ This program could not have been possible without the + exceptionnal tools already available such as +

+ +
+ +
\ No newline at end of file diff --git a/client/partials/collections.html b/client/partials/collections.html new file mode 100644 index 0000000..d16023a --- /dev/null +++ b/client/partials/collections.html @@ -0,0 +1,17 @@ +
+
+

Choose your collection

+
+
+ + + + diff --git a/client/partials/databases.html b/client/partials/databases.html new file mode 100644 index 0000000..bcad9eb --- /dev/null +++ b/client/partials/databases.html @@ -0,0 +1,17 @@ +
+
+

Choose your database

+
+
+ + + + diff --git a/client/partials/directives/key.html b/client/partials/directives/key.html new file mode 100644 index 0000000..4f6f506 --- /dev/null +++ b/client/partials/directives/key.html @@ -0,0 +1,10 @@ + + {{value}} + + + + + + + + \ No newline at end of file diff --git a/client/partials/directives/value.html b/client/partials/directives/value.html new file mode 100644 index 0000000..802a83b --- /dev/null +++ b/client/partials/directives/value.html @@ -0,0 +1,12 @@ + + + {{ value}} + + + {{value | number | replaceAllCommasBySpaces}} + + +
{{value | niceJSON}}
+
+ +
\ No newline at end of file diff --git a/client/partials/document.html b/client/partials/document.html new file mode 100644 index 0000000..cc58ff3 --- /dev/null +++ b/client/partials/document.html @@ -0,0 +1,39 @@ +
+
+ +
+
+ +
+
+ +
+
+ + {{idx}} / {{ meta.count}} + +
+
+ +
+
+ + + + + + + + + + + + + +
KeysValues
+ +
+
diff --git a/client/partials/home.html b/client/partials/home.html new file mode 100644 index 0000000..281c686 --- /dev/null +++ b/client/partials/home.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/client/partials/servers.html b/client/partials/servers.html new file mode 100644 index 0000000..2b6e235 --- /dev/null +++ b/client/partials/servers.html @@ -0,0 +1,17 @@ +
+
+

Choose your server

+
+
+ + + + diff --git a/handlerWrapper.go b/handlerWrapper.go new file mode 100644 index 0000000..6cdd8f2 --- /dev/null +++ b/handlerWrapper.go @@ -0,0 +1,24 @@ +package main + +import ( + "encoding/json" + "net/http" +) + +type errorWrapper struct { + Error error `json:"error"` +} + +type ApiHandler func(w http.ResponseWriter, request *http.Request) (interface{}, error) + +func (this ApiHandler) ServeHTTP(w http.ResponseWriter, request *http.Request) { + ret, err := this(w, request) + if err != nil { + ret = &errorWrapper{err} + w.WriteHeader(500) + } else { + w.WriteHeader(200) + } + enc := json.NewEncoder(w) + enc.Encode(ret) +} diff --git a/main.go b/main.go new file mode 100644 index 0000000..a316164 --- /dev/null +++ b/main.go @@ -0,0 +1,89 @@ +package main + +import ( + "fmt" + "github.com/gorilla/mux" + "io/ioutil" + "launchpad.net/goyaml" + "log" + "net/http" + "path" + "strconv" +) + +const PARAM_FILE string = "params.yml" +const STATIC_DIR string = "client" + +type Params struct { + Port int `yaml:"Port,omitempty"` + ServingAddress string `yaml:"ServingAddress,omitempty"` + MongoServers []string `yaml:"MongoServers,omitempty"` +} + +func (this *Params) LoadFromYamlFile(fileName string) error { + data, err := ioutil.ReadFile(fileName) + if err != nil { + return err + } + return this.LoadFromYamlData(data) +} + +func (this *Params) LoadFromYamlData(data []byte) error { + var err error + p := new(Params) + if err = goyaml.Unmarshal(data, p); err != nil { + return err + } + + if p.ServingAddress != "" { + this.ServingAddress = p.ServingAddress + } + if p.Port > 0 { + this.Port = p.Port + } + if p.MongoServers != nil && len(p.MongoServers) > 0 { + this.MongoServers = p.MongoServers + } + return nil +} + +var params = &Params{8000, "localhost", []string{"localhost:27017"}} + +func init() { + if err := params.LoadFromYamlFile(PARAM_FILE); err != nil { + panic(err) + } +} + +func serveStatic(router *mux.Router) { + handler := func(w http.ResponseWriter, request *http.Request) { + vars := mux.Vars(request) + filepath := "/" + vars["path"] + w.Header().Set("Cache-Control", "public, max-age=43200") + http.ServeFile(w, request, path.Join(STATIC_DIR, filepath)) + } + router.HandleFunc("/{path:.*}", handler) +} + +func serveApi(router *mux.Router) { + router.Handle("/servers", ApiHandler(getAvailableServers)) + router.Handle("/{server}/databases", ApiHandler(getAvailableDataBases)) + router.Handle("/{server}/{database}/collections", ApiHandler(getAvailableCollections)) + router.Handle("/{server}/{database}/{collection}/idx/{index:[0-9]+}", ApiHandler(getDocumentByIndex)) + +} + +func createMuxRouter() http.Handler { + r := mux.NewRouter() + serveApi(r.PathPrefix("/api").Subrouter()) + serveStatic(r.PathPrefix("/").Subrouter()) + return r +} + +func main() { + address := params.ServingAddress + ":" + strconv.Itoa(params.Port) + fmt.Println("serving ", address) + if err := http.ListenAndServe(address, createMuxRouter()); err != nil { + log.Fatal(err) + } +} diff --git a/main_test.go b/main_test.go new file mode 100644 index 0000000..0d1b2f0 --- /dev/null +++ b/main_test.go @@ -0,0 +1,60 @@ +package main + +import ( + "io/ioutil" + "net/http" + "net/http/httptest" + "os" + "path" + "reflect" + "testing" +) + +func TestLoadFromYamlDataAndInitialParams(t *testing.T) { + if params.Port != 8000 { + t.Error("wrong port") + } + if params.ServingAddress != "localhost" { + t.Error("wrong png dpi") + } + if !reflect.DeepEqual(params.MongoServers, []string{"localhost:27017"}) { + t.Fail() + } +} + +func createMockStaticFile() (*os.File, error) { + f, err := ioutil.TempFile(STATIC_DIR, "go_testing") + if err != nil { + return nil, err + } + return f, ioutil.WriteFile(f.Name(), []byte("hello world"), 0600) + +} + +func TestServingStaticFiles(t *testing.T) { + ts := httptest.NewServer(createMuxRouter()) + defer ts.Close() + + f, err := createMockStaticFile() + if err != nil { + t.Error(err) + return + } + defer os.Remove(f.Name()) + + res, err := http.Get(ts.URL + "/" + path.Base(f.Name())) + if err != nil { + t.Error(err) + return + } + body, err := ioutil.ReadAll(res.Body) + res.Body.Close() + if err != nil { + t.Error(err) + return + } + if string(body) != "hello world" { + t.Error(f.Name()) + } + +} diff --git a/params.yml b/params.yml new file mode 100644 index 0000000..24bf5f3 --- /dev/null +++ b/params.yml @@ -0,0 +1,16 @@ +--- + +# This is a YAML configuration file. To see yaml file specification, see its +# wikipedia page at http://en.wikipedia.org/wiki/YAML + + +# The port where the service will run +Port: 8000 + +# The address where the service will run. If you wish to run it on your computer, you +# should use `localhost`. If you wish to share the service on your local network, you +# should use `0.0.0.0` +ServingAddress: localhost + +MongoServers: + - localhost:27017 \ No newline at end of file diff --git a/shared/mongo.go b/shared/mongo.go new file mode 100644 index 0000000..65a8133 --- /dev/null +++ b/shared/mongo.go @@ -0,0 +1,101 @@ +package shared + +import ( + "errors" + "fmt" + "labix.org/v2/mgo" + "net/url" + "strings" +) + +var mongoClients = make(map[string]*mgo.Session) + +func GetCanonicalMongoURL(u string) (string, error) { + urlinfo, err := parseMongoURL(u) + if err != nil { + return "", err + } + return strings.Join(urlinfo.addrs, "/"), nil + +} + +func GetMongoClient(url string) (*mgo.Session, error) { + murl, err := GetCanonicalMongoURL(url) + if err != nil { + return nil, err + } + client, ok := mongoClients[murl] + if !ok { + return getNewMongoClient(url) + } + if client.Ping() != nil { + return getNewMongoClient(url) + } + return client, nil +} + +func getNewMongoClient(url string) (*mgo.Session, error) { + client, err := mgo.Dial(url) + if err != nil { + return nil, err + } + murl, err := GetCanonicalMongoURL(url) + if err != nil { + return nil, err + } + mongoClients[murl] = client + return client, nil +} + +type urlInfo struct { + addrs []string + user string + pass string + db string + options map[string]string +} + +func isOptSep(c rune) bool { + return c == ';' || c == '&' +} + +func parseMongoURL(s string) (*urlInfo, error) { + if strings.HasPrefix(s, "mongodb://") { + s = s[10:] + } + info := &urlInfo{options: make(map[string]string)} + if c := strings.Index(s, "?"); c != -1 { + for _, pair := range strings.FieldsFunc(s[c+1:], isOptSep) { + l := strings.SplitN(pair, "=", 2) + if len(l) != 2 || l[0] == "" || l[1] == "" { + return nil, errors.New("connection option must be key=value: " + pair) + } + info.options[l[0]] = l[1] + } + s = s[:c] + } + if c := strings.Index(s, "@"); c != -1 { + pair := strings.SplitN(s[:c], ":", 2) + if len(pair) > 2 || pair[0] == "" { + return nil, errors.New("credentials must be provided as user:pass@host") + } + var err error + info.user, err = url.QueryUnescape(pair[0]) + if err != nil { + return nil, fmt.Errorf("cannot unescape username in URL: %q", pair[0]) + } + if len(pair) > 1 { + info.pass, err = url.QueryUnescape(pair[1]) + if err != nil { + return nil, fmt.Errorf("cannot unescape password in URL") + } + } + s = s[c+1:] + } + if c := strings.Index(s, "/"); c != -1 { + info.db = s[c+1:] + s = s[:c] + } + info.addrs = strings.Split(s, ",") + return info, nil +} diff --git a/shared/mongo_test.go b/shared/mongo_test.go new file mode 100644 index 0000000..43d9346 --- /dev/null +++ b/shared/mongo_test.go @@ -0,0 +1,18 @@ +package shared + +import ( + "testing" +) + +func TestGetCanonicalMongoURL(t *testing.T) { + tests := map[string]string{"localhost:8000": "localhost:8000", + "mongodb://myuser:mypass@localhost:40001/mydb": "localhost:40001", + "localhost": "localhost"} + for u, exp := range tests { + if s, err := GetCanonicalMongoURL(u); err != nil { + t.Error(err) + } else if s != exp { + t.Error(s, " != ", exp) + } + } +}