commit 9d074189eb0142475ce2beefb0f3ad7888842b4a
parent 63a9cf2913ded097ba0b3300bb0af873605825a8
Author: MTRNord <mtrnord1@gmail.com>
Date: Sun, 18 Feb 2018 18:29:07 +0100
Prepare DB and add basic swagger.yaml
Diffstat:
| A | api/swagger.yaml | | | 71 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | db/db.go | | | 81 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | db/passwords/passwords.go | | | 46 | ++++++++++++++++++++++++++++++++++++++++++++++ |
3 files changed, 198 insertions(+), 0 deletions(-)
diff --git a/api/swagger.yaml b/api/swagger.yaml
@@ -0,0 +1,70 @@
+swagger: "2.0"
+info:
+ description: "API Definition for the Social Networks News Project"
+ version: "0.0.0"
+ title: "Social Networks News Project API"
+ termsOfService: "TODO"
+ contact:
+ email: "freifunknews@nordgedanken.blog"
+ license:
+ name: "GPL-3.0"
+ url: "https://github.com/SocialNetworkNews/SocialNetworkNews_API/raw/master/LICENSE"
+host: "socialnetworksnews.nordgedanken.blog"
+basePath: "/api"
+tags:
+- name: "paper"
+ description: "Everything that is used for papers"
+- name: "user"
+ description: "Get user Data"
+schemes:
+- "https"
+paths:
+ /paper/{uuid}/yesterday:
+ get:
+ tags:
+ - "paper"
+ parameters:
+ - name: "uuid"
+ in: "path"
+ description: "UUID of the paper"
+ required: true
+ type: "integer"
+ format: "int64"
+ summary: "Get the Data that should get displayed of yesterday"
+ description: ""
+ operationId: "getYesterday"
+ produces:
+ - "application/json"
+ responses:
+ 200:
+ description: OK
+ schema:
+ $ref: '#/definitions/PaperData'
+definitions:
+ PaperData:
+ type: "array"
+ items:
+ properties:
+ username:
+ type: "string"
+ user_id:
+ type: "string"
+ display_name:
+ type: "string"
+ userprofile_link:
+ type: "string"
+ text:
+ type: "string"
+ image_urls:
+ type: "array"
+ items:
+ type: "string"
+ created_at:
+ type: "string"
+ favorites:
+ type: "string"
+ retweets:
+ type: "string"
+ retweet:
+ type: "boolean"
+ default: false
+\ No newline at end of file
diff --git a/db/db.go b/db/db.go
@@ -0,0 +1,81 @@
+package db
+
+import (
+ "errors"
+ "github.com/dgraph-io/badger"
+ "github.com/shibukawa/configdir"
+ "os"
+ "path/filepath"
+ "sync"
+)
+
+var DB *badger.DB
+var onceDB sync.Once
+
+func OpenDB() (db *badger.DB, err error) {
+ onceDB.Do(func() {
+ // Open the data.db file. It will be created if it doesn't exist.
+ configDirs := configdir.New("SocialNetworksNews", "API")
+ filePath := filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path)
+
+ if _, StatErr := os.Stat(filePath + "/data/"); os.IsNotExist(StatErr) {
+ MkdirErr := os.MkdirAll(filePath+"/data/", 0700)
+ if MkdirErr != nil {
+ err = MkdirErr
+ return
+ }
+ }
+ if _, StatErr := os.Stat(filePath + "/data/cache/"); os.IsNotExist(StatErr) {
+ MkdirErr := os.MkdirAll(filePath+"/data/cache/", 0700)
+ if MkdirErr != nil {
+ err = MkdirErr
+ return
+ }
+ }
+ opts := badger.DefaultOptions
+ opts.SyncWrites = false
+ opts.Dir = filePath + "/data/cache"
+ opts.ValueDir = filePath + "/data/cache"
+
+ if _, StatErr := os.Stat(filePath + "/data/cache/LOCK"); StatErr == nil {
+ DeleteErr := os.Remove(filePath + "/data/cache/LOCK")
+ if DeleteErr != nil {
+ err = DeleteErr
+ return
+ }
+ }
+
+ expDB, DBErr := badger.Open(opts)
+ if DBErr != nil {
+ err = DBErr
+ return
+ }
+ DB = expDB
+ })
+
+ if DB == nil {
+ err = errors.New("missing DB")
+ return
+ }
+
+ db = DB
+ return
+}
+
+// Get deduplicates all the Gets inside the Database to not repeat that much code.
+func Get(txn *badger.Txn, key []byte) (result []byte, err error) {
+ item, QueryErr := txn.Get(key)
+ if QueryErr != nil && QueryErr != badger.ErrKeyNotFound {
+ err = QueryErr
+ return
+ }
+ if QueryErr != badger.ErrKeyNotFound {
+ valueByte, valueErr := item.Value()
+ result = valueByte
+ if valueErr != nil {
+ err = valueErr
+ return
+ }
+ }
+ return
+}
diff --git a/db/passwords/passwords.go b/db/passwords/passwords.go
@@ -0,0 +1,46 @@
+package passwords
+
+import (
+ "fmt"
+ "github.com/SocialNetworkNews/SocialNetworkNews_API/db"
+ "github.com/dgraph-io/badger"
+ "golang.org/x/crypto/bcrypt"
+)
+
+func SavePassword(password, username string) error {
+ hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
+ if err != nil {
+ return err
+ }
+
+ userDB, err := db.OpenDB()
+ if err != nil {
+ return err
+ }
+
+ return userDB.Update(func(txn *badger.Txn) error {
+ return txn.Set([]byte(fmt.Sprintf("users|%s|password", username)), hash)
+ })
+}
+
+func CheckPassword(username, password string) (bool, error) {
+ userDB, err := db.OpenDB()
+ if err != nil {
+ return false, err
+ }
+ var hash []byte
+
+ DBErr := userDB.View(func(txn *badger.Txn) error {
+ var err error
+ hash, err = db.Get(txn, []byte(fmt.Sprintf("users|%s|password", username)))
+ return err
+ })
+ if DBErr != nil {
+ return false, DBErr
+ }
+
+ if err := bcrypt.CompareHashAndPassword(hash, []byte(password)); err != nil {
+ return false, err
+ }
+ return true, nil
+}