From bad807b79d96958c1a31af3259f4ec588cb47c49 Mon Sep 17 00:00:00 2001 From: arnaucode Date: Thu, 1 Feb 2018 13:14:51 +0100 Subject: [PATCH] signup and login working --- .gitignore | 1 + README.md | 18 ++++++ RESTfunctions.go | 96 ++++++++++++++++++++++++++++ config.json | 8 +++ errors.go | 15 +++++ hash.go | 12 ++++ log.go | 19 ++++++ main.go | 51 +++++++++++++++ mongoOperations.go | 26 ++++++++ readConfig.go | 26 ++++++++ restConfig.go | 47 ++++++++++++++ restRoutes.go | 24 +++++++ tokens.go | 49 ++++++++++++++ webapp/.gitignore | 5 ++ webapp/app.js | 88 +++++++++++++++++++++++++ webapp/bower.json | 19 ++++++ webapp/css/own.css | 5 ++ webapp/img/icon.png | Bin 0 -> 11188 bytes webapp/index.html | 73 +++++++++++++++++++++ webapp/package.json | 13 ++++ webapp/views/login/login.html | 35 ++++++++++ webapp/views/login/login.js | 36 +++++++++++ webapp/views/main/main.html | 14 ++++ webapp/views/main/main.js | 16 +++++ webapp/views/navbar.html | 49 ++++++++++++++ webapp/views/navbar.js | 20 ++++++ webapp/views/navbarOLD.html | 51 +++++++++++++++ webapp/views/newmodel/newmodel.html | 18 ++++++ webapp/views/newmodel/newmodel.js | 79 +++++++++++++++++++++++ webapp/views/profile/profile.html | 31 +++++++++ webapp/views/profile/profile.js | 24 +++++++ webapp/views/signup/signup.html | 38 +++++++++++ webapp/views/signup/signup.js | 34 ++++++++++ 33 files changed, 1040 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 RESTfunctions.go create mode 100755 config.json create mode 100755 errors.go create mode 100644 hash.go create mode 100755 log.go create mode 100644 main.go create mode 100755 mongoOperations.go create mode 100755 readConfig.go create mode 100755 restConfig.go create mode 100755 restRoutes.go create mode 100644 tokens.go create mode 100644 webapp/.gitignore create mode 100644 webapp/app.js create mode 100644 webapp/bower.json create mode 100644 webapp/css/own.css create mode 100644 webapp/img/icon.png create mode 100644 webapp/index.html create mode 100644 webapp/package.json create mode 100755 webapp/views/login/login.html create mode 100755 webapp/views/login/login.js create mode 100755 webapp/views/main/main.html create mode 100755 webapp/views/main/main.js create mode 100755 webapp/views/navbar.html create mode 100755 webapp/views/navbar.js create mode 100644 webapp/views/navbarOLD.html create mode 100644 webapp/views/newmodel/newmodel.html create mode 100644 webapp/views/newmodel/newmodel.js create mode 100644 webapp/views/profile/profile.html create mode 100644 webapp/views/profile/profile.js create mode 100755 webapp/views/signup/signup.html create mode 100755 webapp/views/signup/signup.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0bdfd49 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +keys diff --git a/README.md b/README.md new file mode 100644 index 0000000..fe80d31 --- /dev/null +++ b/README.md @@ -0,0 +1,18 @@ +# decentralized-blogging-platform + +Decentralized blogging platform, using IPFS + + + +### Instructions + +- Need to add: +``` +ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin '["*"]' +``` +in order to allow access to IPFS from the app. + +- Start the IPFS daemon +``` +ipfs daemon +``` diff --git a/RESTfunctions.go b/RESTfunctions.go new file mode 100644 index 0000000..4a7e0b0 --- /dev/null +++ b/RESTfunctions.go @@ -0,0 +1,96 @@ +package main + +import ( + "encoding/json" + "fmt" + "net/http" + + "gopkg.in/mgo.v2/bson" +) + +type User struct { + Id bson.ObjectId `json:"id" bson:"_id,omitempty"` + Username string `json:"username"` + Email string `json:"email"` + Password string `json:"password"` + Token string `json:"token"` +} + +func Index(w http.ResponseWriter, r *http.Request) { + fmt.Fprintln(w, "clientApp") +} + +func Signup(w http.ResponseWriter, r *http.Request) { + decoder := json.NewDecoder(r.Body) + var user User + err := decoder.Decode(&user) + if err != nil { + panic(err) + } + defer r.Body.Close() + + fmt.Print("user signup: ") + fmt.Println(user.Username) + + //save the new project to mongodb + rUser := User{} + err = userCollection.Find(bson.M{"email": user.Email}).One(&rUser) + if err != nil { + //user not exists + err = userCollection.Insert(user) + err = userCollection.Find(bson.M{"email": user.Email}).One(&user) + } else { + //user exists + http.Error(w, "user already registered", http.StatusConflict) + return + } + + fmt.Println(user.Username) + jResp, err := json.Marshal(user) + if err != nil { + panic(err) + } + fmt.Fprintln(w, string(jResp)) +} + +func Login(w http.ResponseWriter, r *http.Request) { + + decoder := json.NewDecoder(r.Body) + var user User + err := decoder.Decode(&user) + if err != nil { + panic(err) + } + defer r.Body.Close() + //TODO check if the user password exists in the database + + fmt.Print("user login: ") + fmt.Println(user) + + //save the new project to mongodb + rUser := User{} + err = userCollection.Find(bson.M{"email": user.Email}).One(&rUser) + if err != nil { + http.Error(w, "error login, email not foun", http.StatusConflict) + return + } + //user exists, check password + if user.Password != rUser.Password { + http.Error(w, "error login, password not match", http.StatusConflict) + return + } + + token, err := newToken() + check(err) + rUser.Token = token + + //update with the token + err = userCollection.Update(bson.M{"_id": rUser.Id}, rUser) + check(err) + + jResp, err := json.Marshal(rUser) + if err != nil { + panic(err) + } + fmt.Fprintln(w, string(jResp)) +} diff --git a/config.json b/config.json new file mode 100755 index 0000000..d0f2924 --- /dev/null +++ b/config.json @@ -0,0 +1,8 @@ +{ + "apiport": "3000", + "webport": "8081", + "mongodb": { + "ip": "127.0.0.1:27017", + "database": "decentralized-blogging-platform" + } +} diff --git a/errors.go b/errors.go new file mode 100755 index 0000000..b3cf6b2 --- /dev/null +++ b/errors.go @@ -0,0 +1,15 @@ +package main + +import ( + "log" + "runtime" +) + +func check(err error) { + if err != nil { + _, fn, line, _ := runtime.Caller(1) + log.Println(line) + log.Println(fn) + log.Println(err) + } +} diff --git a/hash.go b/hash.go new file mode 100644 index 0000000..87c2932 --- /dev/null +++ b/hash.go @@ -0,0 +1,12 @@ +package main + +import ( + "crypto/sha256" + "encoding/base64" +) + +func hash(s string) string { + h := sha256.New() + h.Write([]byte(s)) + return base64.URLEncoding.EncodeToString(h.Sum(nil)) +} diff --git a/log.go b/log.go new file mode 100755 index 0000000..d12c469 --- /dev/null +++ b/log.go @@ -0,0 +1,19 @@ +package main + +import ( + "io" + "log" + "os" + "time" +) + +func savelog() { + timeS := time.Now().String() + _ = os.Mkdir("logs", os.ModePerm) + logFile, err := os.OpenFile("logs/log-"+timeS+".log", os.O_CREATE|os.O_APPEND|os.O_RDWR, 0666) + if err != nil { + panic(err) + } + mw := io.MultiWriter(os.Stdout, logFile) + log.SetOutput(mw) +} diff --git a/main.go b/main.go new file mode 100644 index 0000000..ca1e809 --- /dev/null +++ b/main.go @@ -0,0 +1,51 @@ +package main + +import ( + "fmt" + "log" + "net/http" + + "github.com/fatih/color" + "github.com/gorilla/handlers" + mgo "gopkg.in/mgo.v2" +) + +const keysDir = "keys" +const keysize = 2048 +const hashize = 1536 + +var userCollection *mgo.Collection + +func main() { + color.Blue("Starting ipfs-ai-models-market") + + readConfig("config.json") + fmt.Println(config) + + initializeToken() + + //mongodb + session, err := getSession() + check(err) + userCollection = getCollection(session, "users") + + //run thw webserver + go GUI() + + //run API + log.Println("api server running") + log.Print("port: ") + log.Println(config.APIPort) + router := NewRouter() + headersOk := handlers.AllowedHeaders([]string{"X-Requested-With", "Access-Control-Allow-Origin"}) + originsOk := handlers.AllowedOrigins([]string{"*"}) + methodsOk := handlers.AllowedMethods([]string{"GET", "HEAD", "POST", "PUT", "OPTIONS"}) + log.Fatal(http.ListenAndServe(":"+config.APIPort, handlers.CORS(originsOk, headersOk, methodsOk)(router))) +} + +func GUI() { + //here, run webserver + log.Println("webserver in port " + config.WebPort) + http.Handle("/", http.FileServer(http.Dir("./webapp"))) + http.ListenAndServe(":"+config.WebPort, nil) +} diff --git a/mongoOperations.go b/mongoOperations.go new file mode 100755 index 0000000..4b21ca6 --- /dev/null +++ b/mongoOperations.go @@ -0,0 +1,26 @@ +package main + +import ( + mgo "gopkg.in/mgo.v2" +) + +func getSession() (*mgo.Session, error) { + session, err := mgo.Dial("mongodb://" + config.Mongodb.IP) + if err != nil { + panic(err) + } + //defer session.Close() + + // Optional. Switch the session to a monotonic behavior. + session.SetMode(mgo.Monotonic, true) + + // Optional. Switch the session to a monotonic behavior. + session.SetMode(mgo.Monotonic, true) + + return session, err +} +func getCollection(session *mgo.Session, collection string) *mgo.Collection { + + c := session.DB(config.Mongodb.Database).C(collection) + return c +} diff --git a/readConfig.go b/readConfig.go new file mode 100755 index 0000000..3632cfb --- /dev/null +++ b/readConfig.go @@ -0,0 +1,26 @@ +package main + +import ( + "encoding/json" + "io/ioutil" +) + +//Config reads the config +type Config struct { + APIPort string `json:"apiport"` + WebPort string `json:"webport"` + Mongodb MongoConfig `json:"mongodb"` +} +type MongoConfig struct { + IP string `json:"ip"` + Database string `json:"database"` +} + +var config Config + +func readConfig(path string) { + file, err := ioutil.ReadFile(path) + check(err) + content := string(file) + json.Unmarshal([]byte(content), &config) +} diff --git a/restConfig.go b/restConfig.go new file mode 100755 index 0000000..36a332e --- /dev/null +++ b/restConfig.go @@ -0,0 +1,47 @@ +package main + +import ( + "log" + "net/http" + "time" + + "github.com/gorilla/mux" +) + +type Route struct { + Name string + Method string + Pattern string + HandlerFunc http.HandlerFunc +} + +func Logger(inner http.Handler, name string) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + start := time.Now() + + inner.ServeHTTP(w, r) + + log.Printf( + "%s\t%s\t%s\t%s", + r.Method, + r.RequestURI, + name, + time.Since(start), + ) + }) +} +func NewRouter() *mux.Router { + router := mux.NewRouter().StrictSlash(true) + for _, route := range routes { + var handler http.Handler + handler = route.HandlerFunc + handler = Logger(handler, route.Name) + + router. + Methods(route.Method). + Path(route.Pattern). + Name(route.Name). + Handler(handler) + } + return router +} diff --git a/restRoutes.go b/restRoutes.go new file mode 100755 index 0000000..e053e94 --- /dev/null +++ b/restRoutes.go @@ -0,0 +1,24 @@ +package main + +type Routes []Route + +var routes = Routes{ + Route{ + "Index", + "GET", + "/", + Index, + }, + Route{ + "Signup", + "POST", + "/signup", + Signup, + }, + Route{ + "Login", + "POST", + "/login", + Login, + }, +} diff --git a/tokens.go b/tokens.go new file mode 100644 index 0000000..94db69c --- /dev/null +++ b/tokens.go @@ -0,0 +1,49 @@ +package main + +import ( + "fmt" + "time" + + jwt "github.com/dgrijalva/jwt-go" +) + +const ( + signingKey = "this is the secret signing key" +) + +var createdToken string + +func initializeToken() { + var err error + createdToken, err = newToken() + if err != nil { + fmt.Println("Creating token failed") + } +} + +func newToken() (string, error) { + signingKeyB := []byte(signingKey) + // Create the token + token := jwt.New(jwt.SigningMethodHS256) + // Set some claims + claims := make(jwt.MapClaims) + claims["foo"] = "bar" + claims["exp"] = time.Now().Add(time.Hour * 72).Unix() + token.Claims = claims + + // Sign and get the complete encoded token as a string + tokenString, err := token.SignedString(signingKeyB) + return tokenString, err +} + +func parseToken(myToken string, myKey string) { + token, err := jwt.Parse(myToken, func(token *jwt.Token) (interface{}, error) { + return []byte(myKey), nil + }) + + if err == nil && token.Valid { + fmt.Println("Your token is valid. I like your style.") + } else { + fmt.Println("This token is terrible! I cannot accept this.") + } +} diff --git a/webapp/.gitignore b/webapp/.gitignore new file mode 100644 index 0000000..19124e1 --- /dev/null +++ b/webapp/.gitignore @@ -0,0 +1,5 @@ +bower_components +node_modules +package-lock.json +keys +*.pem diff --git a/webapp/app.js b/webapp/app.js new file mode 100644 index 0000000..56016b0 --- /dev/null +++ b/webapp/app.js @@ -0,0 +1,88 @@ +'use strict'; + +var apiurl = "http://127.0.0.1:3000/"; + +angular.module('app', [ + 'ngRoute', + 'ngMessages', + 'toastr', + 'chart.js', + 'app.navbar', + 'app.signup', + 'app.login', + 'app.main', + 'app.newmodel', + 'app.profile' +]). +config(['$locationProvider', '$routeProvider', function($locationProvider, $routeProvider) { + $locationProvider.hashPrefix('!'); + /*$routeProvider.otherwise({ + redirectTo: '/main' + });*/ + + if((localStorage.getItem('dblog_user'))) + { + console.log(window.location.hash); + if((window.location.hash==='#!/login')||(window.location.hash==='#!/signup')) + { + window.location='#!/main'; + } + + $routeProvider.otherwise({redirectTo: '/main'}); + }else{ + if((window.location!=='#!/login')||(window.location!=='#!/signup')||(window.location!=='#!/main')) + { + console.log('app, user no logged'); + + localStorage.removeItem('dblog_user'); + localStorage.removeItem('dblog_user'); + window.location='#!/main'; + $routeProvider.otherwise({redirectTo: '/main'}); + } + } + }]) + .config(function(toastrConfig) { + angular.extend(toastrConfig, { + autoDismiss: false, + containerId: 'toast-container', + maxOpened: 0, + newestOnTop: true, + positionClass: 'toast-bottom-right', + preventDuplicates: false, + preventOpenDuplicates: false, + target: 'body' + }); + }) + .factory('httpInterceptor', function httpInterceptor() { + return { + request: function(config) { + return config; + }, + + requestError: function(config) { + return config; + }, + + response: function(res) { + return res; + }, + + responseError: function(res) { + return res; + } + }; + }) + .factory('api', function($http) { + return { + init: function() { + var dblog_user = JSON.parse(localStorage.getItem('dblog_user')); + if (dblog_user) { + $http.defaults.headers.common['Authorization'] = dblog_user.token; + $http.defaults.headers.post['Authorization'] = dblog_user.token; + } + } + }; + }) + .run(function(api) { + api.init(); + }); diff --git a/webapp/bower.json b/webapp/bower.json new file mode 100644 index 0000000..a5d1411 --- /dev/null +++ b/webapp/bower.json @@ -0,0 +1,19 @@ +{ + "name": "ipfs-ai-models-market", + "description": "", + "version": "0.0.0", + "homepage": "", + "license": "GNU", + "private": true, + "dependencies": { + "angular": "^1.6.2", + "angular-route": "^1.6.1", + "angular-messages": "^1.6.5", + "angular-bootstrap-material": "abm#^0.1.4", + "angular-bootstrap": "^2.5.0", + "components-font-awesome": "^4.7.0", + "angular-toastr": "^2.1.1", + "cssMaterialColors": "*", + "angular-chart.js": "^1.1.1" + } +} diff --git a/webapp/css/own.css b/webapp/css/own.css new file mode 100644 index 0000000..e3b46ad --- /dev/null +++ b/webapp/css/own.css @@ -0,0 +1,5 @@ +.o_nav { + background: #ffffff!important; + color: #000000!important; + /*border-bottom: 2px solid #4DD0E1!important;*/ +} diff --git a/webapp/img/icon.png b/webapp/img/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0678b5bdfa109fbcbd6eb4c1a7ee560bab96ded2 GIT binary patch literal 11188 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 HW?}yaqd9#+ literal 0 HcmV?d00001 diff --git a/webapp/index.html b/webapp/index.html new file mode 100644 index 0000000..ed820ff --- /dev/null +++ b/webapp/index.html @@ -0,0 +1,73 @@ + + + + + + ipfs-ai-models-market + + + + + + + + + + + + + + + + + + + +
+



+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/webapp/package.json b/webapp/package.json new file mode 100644 index 0000000..061866f --- /dev/null +++ b/webapp/package.json @@ -0,0 +1,13 @@ +{ + "name": "decentralized-blogging-platform", + "version": "1.0.0", + "description": "", + "scripts": { + "postinstall": "bower install", + "prestart": "npm install", + "start": "http-server" + }, + "dependencies": { + "bootstrap": "^4.0.0" + } +} diff --git a/webapp/views/login/login.html b/webapp/views/login/login.html new file mode 100755 index 0000000..04e91f5 --- /dev/null +++ b/webapp/views/login/login.html @@ -0,0 +1,35 @@ +
+
+
+ +
+
+
+
+

+ Login +

+
+ +
+
+ +
+
+
+ Signup +
+
+
Login
+
+
+
+
+
+ + +
+ +
+
+
diff --git a/webapp/views/login/login.js b/webapp/views/login/login.js new file mode 100755 index 0000000..42d36f9 --- /dev/null +++ b/webapp/views/login/login.js @@ -0,0 +1,36 @@ +'use strict'; + +angular.module('app.login', ['ngRoute']) + + .config(['$routeProvider', function($routeProvider) { + $routeProvider.when('/login', { + templateUrl: 'views/login/login.html', + controller: 'LoginCtrl' + }); + }]) + + .controller('LoginCtrl', function($scope, $rootScope, $http, $routeParams, toastr) { + $rootScope.server = "" + $scope.user = {}; + + $scope.login = function() { + $http({ + url: apiurl + 'login', + method: "POST", + headers: { + "Content-Type": undefined + }, + data: $scope.user + }) + .then(function(data) { + console.log("data: "); + console.log(data.data); + localStorage.setItem("dblog_user", JSON.stringify(data.data)); + window.location.reload(); + }, + function(data) { + console.log(data); + }); + + }; + }); diff --git a/webapp/views/main/main.html b/webapp/views/main/main.html new file mode 100755 index 0000000..3acdf08 --- /dev/null +++ b/webapp/views/main/main.html @@ -0,0 +1,14 @@ +
+
+
+
+ Card image cap +
+
Post1
+

Some quick example text to build on the card title and make up the bulk of the card's content.

+ Go somewhere +
+
+
+
+
diff --git a/webapp/views/main/main.js b/webapp/views/main/main.js new file mode 100755 index 0000000..fb833fc --- /dev/null +++ b/webapp/views/main/main.js @@ -0,0 +1,16 @@ +'use strict'; + +angular.module('app.main', ['ngRoute']) + + .config(['$routeProvider', function($routeProvider) { + $routeProvider.when('/main', { + templateUrl: 'views/main/main.html', + controller: 'MainCtrl' + }); + }]) + + .controller('MainCtrl', function($scope, $rootScope, $http) { + + + + }); diff --git a/webapp/views/navbar.html b/webapp/views/navbar.html new file mode 100755 index 0000000..da1123a --- /dev/null +++ b/webapp/views/navbar.html @@ -0,0 +1,49 @@ +
+ +
diff --git a/webapp/views/navbar.js b/webapp/views/navbar.js new file mode 100755 index 0000000..706c3ea --- /dev/null +++ b/webapp/views/navbar.js @@ -0,0 +1,20 @@ +'use strict'; + +angular.module('app.navbar', ['ngRoute']) + + .config(['$routeProvider', function($routeProvider) { + $routeProvider.when('/navbar', { + templateUrl: 'views/navbar.html', + controller: 'NavbarCtrl' + }); + }]) + + .controller('NavbarCtrl', function($scope) { + $scope.user = JSON.parse(localStorage.getItem("dblog_user")); + console.log("user", $scope.user); + $scope.logout = function() { + localStorage.removeItem("dblog_user"); + window.location.reload(); + }; + + }); diff --git a/webapp/views/navbarOLD.html b/webapp/views/navbarOLD.html new file mode 100644 index 0000000..d363130 --- /dev/null +++ b/webapp/views/navbarOLD.html @@ -0,0 +1,51 @@ + diff --git a/webapp/views/newmodel/newmodel.html b/webapp/views/newmodel/newmodel.html new file mode 100644 index 0000000..9d41474 --- /dev/null +++ b/webapp/views/newmodel/newmodel.html @@ -0,0 +1,18 @@ +
+
+
+
+
+

New model

+ + + + + + + Upload +
+
+
+
+
diff --git a/webapp/views/newmodel/newmodel.js b/webapp/views/newmodel/newmodel.js new file mode 100644 index 0000000..dd09e51 --- /dev/null +++ b/webapp/views/newmodel/newmodel.js @@ -0,0 +1,79 @@ +'use strict'; + +angular.module('app.newmodel', ['ngRoute']) + + .config(['$routeProvider', function($routeProvider) { + $routeProvider.when('/newmodel', { + templateUrl: 'views/newmodel/newmodel.html', + controller: 'NewModelCtrl' + }); + }]) + + .controller('NewModelCtrl', function($scope, $rootScope, $http, toastr) { + + $scope.file = {}; + + $scope.upload = function() { + console.log("upload model"); + var formdata = new FormData(); + formdata.append("file", $scope.file); + + //add the file to ipfs + /*$http({ + url: ipfs_url + 'add', + method: "POST", + headers: { + "Content-Type": undefined + }, + data: formdata + }) + .then(function(data) { + console.log("data: "); + console.log(data.data); + toastr.success("Model added to IPFS"); + }, + function(data) { + console.log(data); + toastr.error("Error adding Model to IPFS"); + });*/ + + //add the data to userdata + $http({ + url: clienturl + 'model', + method: "POST", + headers: { + "Content-Type": undefined + }, + data: $scope.model + }) + .then(function(data) { + console.log("data: "); + console.log(data.data); + window.location="/"; + toastr.success("Model uploaded"); + }, + function(data) { + console.log(data); + }); + + + }; + + + + }) + .directive('fileModel', ['$parse', function($parse) { + //directive code from https://www.tutorialspoint.com/angularjs/angularjs_upload_file.htm + return { + restrict: 'A', + link: function(scope, element, attrs) { + var model = $parse(attrs.fileModel); + var modelSetter = model.assign; + element.bind('change', function() { + scope.$apply(function() { + modelSetter(scope, element[0].files[0]); + }); + }); + } + }; + }]); diff --git a/webapp/views/profile/profile.html b/webapp/views/profile/profile.html new file mode 100644 index 0000000..fd95768 --- /dev/null +++ b/webapp/views/profile/profile.html @@ -0,0 +1,31 @@ +
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + +
#TitleDescriptionAccuracyRating
1{{model.title}}{{model.description}}{{model.accuracy}}{{model.rating}}
+
+
+
+
diff --git a/webapp/views/profile/profile.js b/webapp/views/profile/profile.js new file mode 100644 index 0000000..08d681c --- /dev/null +++ b/webapp/views/profile/profile.js @@ -0,0 +1,24 @@ +'use strict'; + +angular.module('app.profile', ['ngRoute']) + + .config(['$routeProvider', function($routeProvider) { + $routeProvider.when('/profile', { + templateUrl: 'views/profile/profile.html', + controller: 'ProfileCtrl' + }); + }]) + + .controller('ProfileCtrl', function($scope, $rootScope, $http) { + + $http.get(clienturl + 'user') + .then(function(data) { + console.log('data success'); + console.log(data); + $scope.user = data.data; + localStorage.setItem("ai_user", JSON.stringify($scope.user)); + + }, function(data) { + console.log('no user'); + }); + }); diff --git a/webapp/views/signup/signup.html b/webapp/views/signup/signup.html new file mode 100755 index 0000000..571f5fc --- /dev/null +++ b/webapp/views/signup/signup.html @@ -0,0 +1,38 @@ +
+
+
+ +
+
+
+
+

+ Signup +

+
+ +
+
+ +
+
+ +
+
+
+ Cancel +
+
+
Signup
+
+
+
+
+
+ + +
+ +
+
+
diff --git a/webapp/views/signup/signup.js b/webapp/views/signup/signup.js new file mode 100755 index 0000000..c37b1f7 --- /dev/null +++ b/webapp/views/signup/signup.js @@ -0,0 +1,34 @@ +'use strict'; + +angular.module('app.signup', ['ngRoute']) + +.config(['$routeProvider', function($routeProvider) { + $routeProvider.when('/signup', { + templateUrl: 'views/signup/signup.html', + controller: 'SignupCtrl' + }); +}]) + +.controller('SignupCtrl', function($scope, $http, $routeParams, $rootScope) { + $scope.signup = function() { + console.log('Doing signup', $scope.user); + $http({ + url: apiurl + 'signup', + method: "POST", + headers: { + "Content-Type": undefined + }, + data: $scope.user + }) + .then(function(data) { + console.log("data: "); + console.log(data.data); + window.location="/#!/login"; + + }, + function(data) { + console.log(data); + }); + + }; +});