socialnetworknews-api

git clone git://archive.git.mtrnord.blog/SocialNetworkNews/socialnetworknews-api.git
Log | Files | Refs | LICENSE

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:
Aapi/swagger.yaml | 71+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adb/db.go | 81+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adb/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 +}