From c6b67fba9c8b92a16410caefcfff6e344cf7a7ab Mon Sep 17 00:00:00 2001 From: Artur Date: Mon, 11 Jun 2018 10:06:20 +0200 Subject: [PATCH] Init --- README.md | 68 ++++- core/config.go | 97 +++++++ core/connect.go | 22 ++ core/models.go | 44 +++ core/object_dao.go | 33 +++ core/tweet_dao.go | 136 ++++++++++ "docs/Instrukcja obs\305\202ugi.pdf" | Bin 0 -> 192424 bytes front/.gitignore | 8 + front/build.sbt | 24 ++ front/dev-server.sh | 2 + front/project/build.properties | 1 + front/project/plugins.sbt | 1 + front/src/main/resources/app.css | 53 ++++ front/src/main/resources/index-dev.html | 21 ++ front/src/main/resources/index.html | 21 ++ front/src/main/scala/twitter/AppModel.scala | 25 ++ front/src/main/scala/twitter/MainApp.scala | 20 ++ .../main/scala/twitter/login/LoginModel.scala | 71 +++++ .../main/scala/twitter/login/LoginRest.scala | 47 ++++ .../main/scala/twitter/login/LoginView.scala | 65 +++++ .../scala/twitter/router/RouterView.scala | 64 +++++ .../main/scala/twitter/shared/DateUtils.scala | 42 +++ .../scala/twitter/shared/LoadingView.scala | 34 +++ .../scala/twitter/shared/PaginationView.scala | 45 ++++ .../scala/twitter/tweets/AddObjectView.scala | 116 ++++++++ .../twitter/tweets/ObjectDeleteView.scala | 53 ++++ .../scala/twitter/tweets/ObjectView.scala | 150 +++++++++++ .../scala/twitter/tweets/TweetsListView.scala | 69 +++++ .../scala/twitter/tweets/TweetsModel.scala | 180 +++++++++++++ .../scala/twitter/tweets/TweetsRest.scala | 114 ++++++++ .../scala/twitter/tweets/TweetsView.scala | 67 +++++ misc/screenshots/screen1.png | Bin 0 -> 67249 bytes twitter-saver/config.go | 30 +++ twitter-saver/config.yaml | 19 ++ twitter-saver/history.go | 100 +++++++ twitter-saver/main.go | 51 ++++ twitter-saver/search.go | 60 +++++ twitter-saver/stream.go | 147 ++++++++++ web/config.go | 28 ++ web/config.yaml | 15 ++ web/main.go | 130 +++++++++ web/objects.go | 254 ++++++++++++++++++ 42 files changed, 2526 insertions(+), 1 deletion(-) create mode 100644 core/config.go create mode 100644 core/connect.go create mode 100644 core/models.go create mode 100644 core/object_dao.go create mode 100644 core/tweet_dao.go create mode 100644 "docs/Instrukcja obs\305\202ugi.pdf" create mode 100644 front/.gitignore create mode 100644 front/build.sbt create mode 100644 front/dev-server.sh create mode 100644 front/project/build.properties create mode 100644 front/project/plugins.sbt create mode 100644 front/src/main/resources/app.css create mode 100644 front/src/main/resources/index-dev.html create mode 100644 front/src/main/resources/index.html create mode 100644 front/src/main/scala/twitter/AppModel.scala create mode 100644 front/src/main/scala/twitter/MainApp.scala create mode 100644 front/src/main/scala/twitter/login/LoginModel.scala create mode 100644 front/src/main/scala/twitter/login/LoginRest.scala create mode 100644 front/src/main/scala/twitter/login/LoginView.scala create mode 100644 front/src/main/scala/twitter/router/RouterView.scala create mode 100644 front/src/main/scala/twitter/shared/DateUtils.scala create mode 100644 front/src/main/scala/twitter/shared/LoadingView.scala create mode 100644 front/src/main/scala/twitter/shared/PaginationView.scala create mode 100644 front/src/main/scala/twitter/tweets/AddObjectView.scala create mode 100644 front/src/main/scala/twitter/tweets/ObjectDeleteView.scala create mode 100644 front/src/main/scala/twitter/tweets/ObjectView.scala create mode 100644 front/src/main/scala/twitter/tweets/TweetsListView.scala create mode 100644 front/src/main/scala/twitter/tweets/TweetsModel.scala create mode 100644 front/src/main/scala/twitter/tweets/TweetsRest.scala create mode 100644 front/src/main/scala/twitter/tweets/TweetsView.scala create mode 100644 misc/screenshots/screen1.png create mode 100644 twitter-saver/config.go create mode 100644 twitter-saver/config.yaml create mode 100644 twitter-saver/history.go create mode 100644 twitter-saver/main.go create mode 100644 twitter-saver/search.go create mode 100644 twitter-saver/stream.go create mode 100644 web/config.go create mode 100644 web/config.yaml create mode 100644 web/main.go create mode 100644 web/objects.go diff --git a/README.md b/README.md index a53a005..7789e47 100644 --- a/README.md +++ b/README.md @@ -1 +1,67 @@ -# twitter-saver \ No newline at end of file +# twitter-saver + +## Description + +### Info +The program was created for *Team project - development of data analysis system* course run by [@pbiecek](https://github.com/pbiecek) at Warsaw University of Technology. + +### Program description + +The aim of the created program is to download tweets from twitter by defined user or keyword. Downloading can be done in two modes: + +* stream +* history + +### Further information + +Full specification and more detailed description of summarization features (in Polish) can be found in [this file](https://github.com/minorczyka/twitter-saver/blob/master/docs/Instrukcja%20obs%C5%82ugi.pdf). + +## Installation + +1. Download binary file from latest release +2. Prepare `config.yaml` +3. Run binaries `twitter-saver` and `web` + +## Usage + +### Running + +The programs can be run from command line with following arguments: + +* `--config` - path to config file + +Config file is stored in YAML format. It contains following information: + +- `db`: + - `host` + - `port` + - `user` + - `password` + - `dbName` - database name in which data will be stored + - `sslMode` - `enable` or `disable` +- `web` - web interface parameters: + - `port` - port on which server will be working + - `secret` - private key used to sign session identifiers. Should be random and renewed periodically. Keys shorter than 256 bits are not recommended. +- `users` - sequence of user accounts. Each account consists of: + - `username` + - `password` +- `twitter` - twitter API keys: + - `consumerKey` + - `consumerSecret` + - `token` + - `tokenSecret` +- `json` - defines additional fields from tweet saved in database + - `all` - saves whole tweet content + - `fields` - sequence of field names to be stored +- `autoDeleteDays` - number of days after which data will be automatically removed + +### Screenshots and live examples + +Screenshot of project UI: +![the screenshot](https://github.com/minorczyka/twitter-saver/blob/master/misc/screenshots/screen1.png) + +## Authors + +* Piotr Krzeszewski +* Łukasz Ławniczak +* Artur Minorczyk diff --git a/core/config.go b/core/config.go new file mode 100644 index 0000000..5db809b --- /dev/null +++ b/core/config.go @@ -0,0 +1,97 @@ +package core + +import ( + "errors" + "fmt" + + "github.com/dghubble/go-twitter/twitter" + "github.com/dghubble/oauth1" +) + +type DbConfig struct { + Host *string + Port *string + User *string + Password *string + DbName *string `yaml:"dbName"` + SslMode *string `yaml:"sslMode"` +} + +type TwitterConfig struct { + ConsumerKey *string `yaml:"consumerKey"` + ConsumerSecret *string `yaml:"consumerSecret"` + Token *string + TokenSecret *string `yaml:"tokenSecret"` +} + +type JsonConfig struct { + All bool + Fields []string +} + +type UserAccount struct { + Username *string + Password *string +} + +type WebConfig struct { + Port *int + Secret *string + Users []UserAccount +} + +func (d *DbConfig) ConnectionString() (string, error) { + if d.Host == nil { + return "", errors.New("Database host not specified.") + } + if d.Port == nil { + return "", errors.New("Database port not specified.") + } + if d.User == nil { + return "", errors.New("Database user not specified.") + } + if d.Password == nil { + return "", errors.New("Database password not specified.") + } + if d.DbName == nil { + return "", errors.New("Database name not specified.") + } + if d.SslMode == nil { + return "", errors.New("Database ssl mode not specified.") + } + return fmt.Sprintf("host=%s port=%s user=%s dbname=%s password=%s sslmode=%s", + *d.Host, *d.Port, *d.User, *d.DbName, *d.Password, *d.SslMode), nil +} + +func (t *TwitterConfig) TwitterClient() (*twitter.Client, error) { + if t.ConsumerKey == nil { + return nil, errors.New("Twitter consumer key not specified.") + } + if t.ConsumerSecret == nil { + return nil, errors.New("Twitter consumer secret not specified.") + } + if t.Token == nil { + return nil, errors.New("Twitter token not specified.") + } + if t.TokenSecret == nil { + return nil, errors.New("Twitter token secret not specified.") + } + config := oauth1.NewConfig(*t.ConsumerKey, *t.ConsumerSecret) + token := oauth1.NewToken(*t.Token, *t.TokenSecret) + httpClient := config.Client(oauth1.NoContext, token) + return twitter.NewClient(httpClient), nil +} + +func (w *WebConfig) WebAccounts() (map[string]string, error) { + result := make(map[string]string) + for _, user := range w.Users { + if user.Username == nil { + return nil, errors.New("Username not specified for account.") + } + if user.Password == nil { + return nil, errors.New("Password not specified for account.") + } + result[*user.Username] = *user.Password + } + return result, nil +} diff --git a/core/connect.go b/core/connect.go new file mode 100644 index 0000000..f63ab6c --- /dev/null +++ b/core/connect.go @@ -0,0 +1,22 @@ +package core + +import ( + "log" + + "github.com/jinzhu/gorm" + _ "github.com/jinzhu/gorm/dialects/postgres" +) + +func Connect(connectionString string) *gorm.DB { + db, err := gorm.Open("postgres", connectionString) + if err != nil { + log.Fatal(err) + } + + db.AutoMigrate(&Tweet{}) + db.AutoMigrate(&Object{}) + + db.Model(&Tweet{}).AddForeignKey("object_id", "objects(id)", "CASCADE", "NO ACTION") + + return db +} diff --git a/core/models.go b/core/models.go new file mode 100644 index 0000000..4687fe2 --- /dev/null +++ b/core/models.go @@ -0,0 +1,44 @@ +package core + +import ( + "time" +) + +type Tweet struct { + ID uint `gorm:"primary_key"` + CreatedAt time.Time + + TweetId int64 `gorm:"not null"` + PublishedAt time.Time `gorm:"not null"` + UserId int64 `gorm:"not null"` + Text string `gorm:"not null" sql:"index"` + ExtendedInfo string + ObjectId uint +} + +type ObjectSource int32 + +const ( + HistorySource ObjectSource = iota + 1 + StreamSource +) + +type ObjectType = int32 + +const ( + UserType ObjectType = iota + 1 + KeywordType +) + +type Object struct { + ID uint `gorm:"primary_key"` + CreatedAt time.Time + DeletedAt *time.Time `sql:"index"` + + Source ObjectSource `gorm:"not null"` + Type ObjectType `gorm:"not null"` + Query string `gorm:"not null"` + HistoryFrom *time.Time + HistoryDone bool + Tweets []Tweet +} diff --git a/core/object_dao.go b/core/object_dao.go new file mode 100644 index 0000000..631cacd --- /dev/null +++ b/core/object_dao.go @@ -0,0 +1,33 @@ +package core + +import ( + "github.com/jinzhu/gorm" +) + +func FindStreamObjects(db *gorm.DB) []Object { + var objects []Object + db.Where(&Object{Source: StreamSource}).Find(&objects) + return objects +} + +func CountStreamObjects(db *gorm.DB) int { + var count int + db.Model(&Object{}).Where("source = ?", StreamSource).Count(&count) + return count +} + +func FindHistoryObjects(db *gorm.DB) []Object { + var objects []Object + db.Where(&Object{Source: HistorySource}).Find(&objects) + return objects +} + +func FindAllObjects(db *gorm.DB) []Object { + var objects []Object + db.Unscoped().Find(&objects) + return objects +} + +func UpdateObjectHistory(db *gorm.DB, object *Object, history bool) { + db.Model(object).Update("history_done", history) +} diff --git a/core/tweet_dao.go b/core/tweet_dao.go new file mode 100644 index 0000000..ccac647 --- /dev/null +++ b/core/tweet_dao.go @@ -0,0 +1,136 @@ +package core + +import ( + "encoding/json" + "errors" + "strings" + "time" + + "github.com/dghubble/go-twitter/twitter" + "github.com/jinzhu/gorm" +) + +func addField(jsonMap map[string]interface{}, result map[string]interface{}, field string) error { + index := strings.Index(field, ".") + if index > -1 { + key := field[:index] + rest := field[index+1:] + value, prs := jsonMap[key] + if !prs { + return errors.New("Field " + key + " not present in json") + } + v, ok := value.(map[string]interface{}) + if !ok { + return errors.New("Field " + key + " is not nested value in json") + } + + r, prs := result[key] + if !prs { + r = make(map[string]interface{}) + } + + res := r.(map[string]interface{}) + err := addField(v, res, rest) + if err != nil { + return err + } + result[key] = res + return nil + } else { + value, prs := jsonMap[field] + if !prs { + return errors.New("Field " + field + " not present in json") + } + result[field] = value + return nil + } +} + +func jsonWithFields(j []byte, fields []string) ([]byte, error) { + var jsonMap map[string]interface{} + err := json.Unmarshal(j, &jsonMap) + if err != nil { + return nil, err + } + + result := make(map[string]interface{}) + for _, field := range fields { + err := addField(jsonMap, result, field) + if err != nil { + return nil, err + } + } + + resultBytes, err := json.Marshal(result) + if err != nil { + return nil, err + } + return resultBytes, nil +} + +func InsertTweet(db *gorm.DB, tweet *twitter.Tweet, objectId uint, fields []string, allFields bool) error { + publishedAt, err := time.Parse(time.RubyDate, tweet.CreatedAt) + if err != nil { + return err + } + + entity := &Tweet{ + PublishedAt: publishedAt, + TweetId: tweet.ID, + UserId: tweet.User.ID, + Text: tweet.Text, + ObjectId: objectId, + } + + if allFields || len(fields) > 0 { + j, err := json.Marshal(tweet) + if err != nil { + db.Create(&entity) + return err + } + + if allFields { + entity.ExtendedInfo = string(j) + } else { + res, err := jsonWithFields(j, fields) + if err != nil { + db.Create(&entity) + return err + } + entity.ExtendedInfo = string(res) + } + } + + db.Create(&entity) + return nil +} + +func InsertTweetUnique(db *gorm.DB, tweet *twitter.Tweet, objectId uint, fields []string, allFields bool) error { + count := 0 + db.Model(&Tweet{}).Where("tweet_id = ? AND object_id = ?", tweet.ID, objectId).Count(&count) + if count == 0 { + return InsertTweet(db, tweet, objectId, fields, allFields) + } else { + return nil + } +} + +func RemoveTweetsOlderThan(db *gorm.DB, date time.Time) error { + _, err := db.Raw("DELETE FROM tweets WHERE published_at::date < ?", date).Rows() + return err +} + +func LatestTweetForObject(db *gorm.DB, objectId uint) (int64, error) { + rows, err := db.Raw("SELECT MAX(tweet_id) FROM tweets WHERE object_id = ?", objectId).Rows() + if err != nil { + return 0, err + } + + rows.Next() + var tweetId int64 + err = rows.Scan(&tweetId) + if err != nil { + return 0, err + } + return tweetId, nil +} diff --git "a/docs/Instrukcja obs\305\202ugi.pdf" "b/docs/Instrukcja obs\305\202ugi.pdf" new file mode 100644 index 0000000000000000000000000000000000000000..1a009c6d67fd3e9ece5979a6ac9c2bcdafddf256 GIT binary patch literal 192424 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 aY{af`Qx~|q3)GTW7${22&aR-YNc + + + + Twitter Saver + + + + + + + + + +

+ + + + + + diff --git a/front/src/main/resources/index.html b/front/src/main/resources/index.html new file mode 100644 index 0000000..904cc66 --- /dev/null +++ b/front/src/main/resources/index.html @@ -0,0 +1,21 @@ + + + + + Twitter Saver + + + + + + + + + +
+ + + + + + diff --git a/front/src/main/scala/twitter/AppModel.scala b/front/src/main/scala/twitter/AppModel.scala new file mode 100644 index 0000000..480de60 --- /dev/null +++ b/front/src/main/scala/twitter/AppModel.scala @@ -0,0 +1,25 @@ +package twitter + +import diode.Circuit +import diode.react.ReactConnector +import twitter.login.{LoginHandler, LoginModel} +import twitter.tweets.{TweetsHandler, TweetsModel} + +case class AppModel(models: Models) + +case class Models(loginModel: LoginModel, tweetsModel: TweetsModel) + +object AppCircuit extends Circuit[AppModel] with ReactConnector[AppModel] { + + override protected def initialModel: AppModel = AppModel( + Models( + LoginModel.initModel, + TweetsModel.initModel + ) + ) + + override protected def actionHandler: AppCircuit.HandlerFunction = composeHandlers( + new LoginHandler(zoomTo(_.models.loginModel)), + new TweetsHandler(zoomTo(_.models.tweetsModel)) + ) +} \ No newline at end of file diff --git a/front/src/main/scala/twitter/MainApp.scala b/front/src/main/scala/twitter/MainApp.scala new file mode 100644 index 0000000..8b68a3a --- /dev/null +++ b/front/src/main/scala/twitter/MainApp.scala @@ -0,0 +1,20 @@ +package twitter + +import japgolly.scalajs.react._ +import japgolly.scalajs.react.vdom.html_<^._ +import org.scalajs.dom +import twitter.login.TryInitialLogin +import twitter.router.RouterView + +object MainApp { + + val apiUrl = "/api" + + def main(args: Array[String]): Unit = { + val modelsConnection = AppCircuit.connect(_.models) + val routerView = modelsConnection(proxy => RouterView(proxy)) + routerView.renderIntoDOM(dom.document.getElementsByClassName("app")(0).domAsHtml) + + AppCircuit.dispatch(TryInitialLogin) + } +} diff --git a/front/src/main/scala/twitter/login/LoginModel.scala b/front/src/main/scala/twitter/login/LoginModel.scala new file mode 100644 index 0000000..e60b9c5 --- /dev/null +++ b/front/src/main/scala/twitter/login/LoginModel.scala @@ -0,0 +1,71 @@ +package twitter.login + +import diode._ +import org.scalajs.dom +import twitter.login.LoginRest.SuccessfulLogin +import twitter.tweets.{ClearCredentials, LoginSuccessful} + +import scala.concurrent.ExecutionContext.Implicits.global +import scala.concurrent.Future +import scala.scalajs.js + +case class LoginModel(username: String, password: String, progress: Boolean, error: Option[String]) + +object LoginModel { + val initModel = LoginModel("", "", progress = false, None) +} + +case class UsernameChanged(username: String) extends Action +case class PasswordChanged(username: String) extends Action +case object LoginSubmit extends Action +case class LoginError(error: String) extends Action +case object Logout extends Action +case object TryInitialLogin extends Action + +class LoginHandler[M](modelRW: ModelRW[M, LoginModel]) extends ActionHandler(modelRW) { + private val credentialsKey = "credentials" + + private def storeCredentials(credentials: String): Unit = + dom.window.localStorage.setItem(credentialsKey, credentials) + + private def loadCredentials(): Option[String] = { + val credentials = dom.window.localStorage.getItem(credentialsKey) + if (credentials == null || credentials == "null") None else Some(credentials) + } + + override def handle = { + case UsernameChanged(u) => + updated(value.copy(username = u)) + case PasswordChanged(p) => + updated(value.copy(password = p)) + case LoginError(e) => + updated(value.copy(progress = false, error = Some(e))) + case LoginSubmit => + val effect = Effect(LoginRest.tryLogin(value.username, value.password) + .map { + case Left(e) => LoginError(e.getMessage) + case Right(SuccessfulLogin(token)) => + val credentials = s"Bearer $token" + storeCredentials(credentials) + LoginSuccessful(credentials) + }) + updated(value.copy(progress = true), effect) + case Logout => + storeCredentials(null) + updated(LoginModel.initModel, Effect(Future.successful(ClearCredentials))) + case TryInitialLogin => + loadCredentials() match { + case Some(credentials) => + val effect = Effect(LoginRest.tryRefreshToken(credentials) + .map { + case Left(_) => NoAction + case Right(SuccessfulLogin(token)) => + val credentials = s"Bearer $token" + storeCredentials(credentials) + LoginSuccessful(credentials) + }) + updated(value, effect) + case None => noChange + } + } +} diff --git a/front/src/main/scala/twitter/login/LoginRest.scala b/front/src/main/scala/twitter/login/LoginRest.scala new file mode 100644 index 0000000..bb20df9 --- /dev/null +++ b/front/src/main/scala/twitter/login/LoginRest.scala @@ -0,0 +1,47 @@ +package twitter.login + +import io.circe.generic.auto._ +import io.circe.parser.decode +import io.circe.syntax._ +import org.scalajs.dom.ext.Ajax.InputData +import org.scalajs.dom.ext.{Ajax, AjaxException} +import twitter.MainApp + +import scala.concurrent.ExecutionContext.Implicits.global +import scala.concurrent.Future + +object LoginRest { + + case class MessageInfo(message: String) + + case class LoginInfo(username: String, password: String) + + case class SuccessfulLogin(token: String) + + def authorizationHeader(credentials: String): Map[String, String] = + Map("Authorization" -> credentials) + + implicit class AjaxFuture[A](val value: Future[Either[Exception, A]]) extends AnyVal { + def recoverAjax(): Future[Either[Exception, A]] = value.recover { + case AjaxException(xhr) if xhr.status == 401 => Left(new Exception("Nieprawidłowa nazwa użytkownika lub hasło.")) + case AjaxException(xhr) if xhr.status == 406 => Left(new Exception("Przekroczono dozwoloną liczbę obiektów tego typu.")) + case AjaxException(_) => Left(new Exception(s"Błąd połączenia")) + case e: Exception => Left(e) + } + } + + def tryLogin(username: String, password: String): Future[Either[Exception, SuccessfulLogin]] = { + val url = s"${MainApp.apiUrl}/login" + val json = LoginInfo(username, password).asJson.noSpaces + Ajax.post(url, data = InputData.str2ajax(json)) + .map(r => decode[SuccessfulLogin](r.responseText)) + .recoverAjax() + } + + def tryRefreshToken(credentials: String): Future[Either[Exception, SuccessfulLogin]] = { + val url = s"${MainApp.apiUrl}/refresh_token" + Ajax.get(url, headers = authorizationHeader(credentials)) + .map(r => decode[SuccessfulLogin](r.responseText)) + .recoverAjax() + } +} diff --git a/front/src/main/scala/twitter/login/LoginView.scala b/front/src/main/scala/twitter/login/LoginView.scala new file mode 100644 index 0000000..4c2a0c4 --- /dev/null +++ b/front/src/main/scala/twitter/login/LoginView.scala @@ -0,0 +1,65 @@ +package twitter.login + +import diode.Action +import japgolly.scalajs.react._ +import japgolly.scalajs.react.vdom.html_<^._ + +object LoginView { + + case class Props(loginModel: LoginModel, dispatch: Action => Callback) + + class Backend($: BackendScope[Props, Unit]) { + private def submit(dispatch: Action => Callback)(e: ReactEvent) = e.preventDefaultCB >> + dispatch(LoginSubmit) >> + CallbackTo.pure(false) + + def render(p: Props): VdomElement = { + <.div(^.className := "row", + <.div(^.className := "col s6 offset-s3", + <.div(^.className := "card-panel login-panel", + <.form(^.onSubmit ==> submit(p.dispatch), + <.div(^.className := "row", + <.div(^.className := "col s12") + ), + <.div(^.className := "row", + <.div(^.className := "input-field col s12", + <.input(^.className := "validate", ^.`type` := "text", ^.name := "username", ^.id := "username", + ^.required := true, ^.disabled := p.loginModel.progress, ^.onChange ==> { e: ReactEventFromInput => + p.dispatch(UsernameChanged(e.target.value)) + }), + <.label(^.`for` := "username", "Nazwa użytkownika") + ) + ), + <.div(^.className := "row", + <.div(^.className := "input-field col s12", + <.input(^.className := "validate", ^.`type` := "password", ^.name := "password", ^.id := "password", + ^.required := true, ^.disabled := p.loginModel.progress, ^.onChange ==> { e: ReactEventFromInput => + p.dispatch(PasswordChanged(e.target.value)) + }), + <.label(^.`for` := "password", "Hasło") + ) + ), + p.loginModel.error.whenDefined { e => + <.div(^.className := "row", + <.p(^.className := "red-text", e) + ) + }, + <.div(^.className := "row", + <.button(^.className := "col s12 btn btn-large waves-effect", ^.`type` := "submit", + ^.name := "btn_login", ^.disabled := p.loginModel.progress, "Zaloguj") + ) + ) + ) + ) + ) + } + } + + val component = ScalaComponent.builder[Props]("LoginView") + .stateless + .renderBackend[Backend] + .build + + def apply(loginModel: LoginModel, dispatch: Action => Callback) = + component(Props(loginModel, dispatch)) +} diff --git a/front/src/main/scala/twitter/router/RouterView.scala b/front/src/main/scala/twitter/router/RouterView.scala new file mode 100644 index 0000000..fdc5c80 --- /dev/null +++ b/front/src/main/scala/twitter/router/RouterView.scala @@ -0,0 +1,64 @@ +package twitter.router + +import diode.react.ModelProxy +import japgolly.scalajs.react._ +import japgolly.scalajs.react.vdom.html_<^._ +import twitter.Models +import twitter.login.{LoginView, Logout} +import twitter.tweets.TweetsView + +object RouterView { + + case class Props(proxy: ModelProxy[Models]) + + class Backend($: BackendScope[Props, Unit]) { + + def render(p: Props): VdomElement = { + val proxy = p.proxy() + <.div(^.className := "main", + <.header( + <.nav(^.className := "teal", + <.div(^.className := "nav-wrapper container", + <.a(^.className := "brand-logo", "Twitter Saver"), + <.ul(^.className := "right", + proxy.tweetsModel.credentials match { + case Some(_) => + <.li( + <.a(^.href := "#!", ^.onClick --> p.proxy.dispatchCB(Logout), + "Wyloguj", + <.i(^.className := "material-icons right", "exit_to_app") + ) + ) + case None => EmptyVdom + } + ) + ) + ) + ), + <.main( + <.div(^.className := "container", + proxy.tweetsModel.credentials match { + case Some(_) => p.proxy.wrap(_.tweetsModel)(x => TweetsView(x(), x.dispatchCB)) + case None => p.proxy.wrap(_.loginModel)(x => LoginView(x(), x.dispatchCB)) + } + ) + ), + <.footer(^.className := "page-footer teal", + <.div(^.className := "footer-copyright", + <.div(^.className := "container", + "Piotr Krzeszewski, Łukasz Ławniczak, Artur Minorczyk © 2018 - Budowa systemu analizy danych" + ) + ) + ) + ) + } + } + + val component = ScalaComponent.builder[Props]("RouterView") + .stateless + .renderBackend[Backend] + .build + + def apply(proxy: ModelProxy[Models]) = + component(Props(proxy)) +} \ No newline at end of file diff --git a/front/src/main/scala/twitter/shared/DateUtils.scala b/front/src/main/scala/twitter/shared/DateUtils.scala new file mode 100644 index 0000000..8d0dc8c --- /dev/null +++ b/front/src/main/scala/twitter/shared/DateUtils.scala @@ -0,0 +1,42 @@ +package twitter.shared + +import scala.scalajs.js +import scala.scalajs.js.Date +import scala.util.Try + +object DateUtils { + def parseDate(value: String): Try[Date] = { + for { + day <- Try(value.substring(0, 2).toInt) + month <- Try(value.substring(3, 5).toInt) + year <- Try(value.substring(6).toInt) + } yield new Date(year, month - 1, day) + } + + def showDate(date: Date): String = { + val day = date.getDate() + val month = date.getMonth() + 1 + val year = date.getFullYear() + f"$day%02d-$month%02d-$year" + } + + def min(a: Date, b: Date): Date = if (a.getTime() < b.getTime()) a else b + + def max(a: Date, b: Date): Date = if (a.getTime() > b.getTime()) a else b + + def nowWithoutTime(): Date = { + val date = new Date() + date.setHours(0, 0, 0, 0) + date + } + + val i18n = js.Dynamic.literal( + cancel = "Anuluj", + clear = "Wyczyść", + months = js.Array("Styczeń", "Luty", "Marzec", "Kwiecień", "Maj", "Czerwiec", "Lipiec", "Sierpień", "Wrzesień", "Październik", "Listopad", "Grudzień"), + monthsShort = js.Array("Sty", "Lut", "Mar", "Kwi", "Maj", "Cze", "Lip", "Sie", "Wrz", "Paź", "Lis", "Gru"), + weekdays = js.Array("Niedziela", "Poniedziałek", "Wtorek", "Środa", "Czwartek", "Piątek", "Sobota"), + weekdaysShort = js.Array("Nie", "Pon", "Wto", "Śro", "Czw", "Pią", "Sob"), + weekdaysAbbrev = js.Array("N", "Pn", "W", "Ś", "Cz", "Pt", "S") + ) +} diff --git a/front/src/main/scala/twitter/shared/LoadingView.scala b/front/src/main/scala/twitter/shared/LoadingView.scala new file mode 100644 index 0000000..587f385 --- /dev/null +++ b/front/src/main/scala/twitter/shared/LoadingView.scala @@ -0,0 +1,34 @@ +package twitter.shared + +import japgolly.scalajs.react._ +import japgolly.scalajs.react.vdom.html_<^._ + +object LoadingView { + + case class Props() + + class Backend($: BackendScope[Props, Unit]) { + def render(p: Props): VdomElement = { + <.div(^.className := "preloader-wrapper big active", + <.div(^.className := "spinner-layer spinner-blue-only", + <.div(^.className := "circle-clipper left", + <.div(^.className := "circle") + ), + <.div(^.className := "gap-patch", + <.div(^.className := "circle") + ), + <.div(^.className := "circle-clipper right", + <.div(^.className := "circle") + ) + ) + ) + } + } + + val component = ScalaComponent.builder[Props]("LoadingView") + .stateless + .renderBackend[Backend] + .build + + def apply() = component(Props()) +} diff --git a/front/src/main/scala/twitter/shared/PaginationView.scala b/front/src/main/scala/twitter/shared/PaginationView.scala new file mode 100644 index 0000000..9f48c15 --- /dev/null +++ b/front/src/main/scala/twitter/shared/PaginationView.scala @@ -0,0 +1,45 @@ +package twitter.shared + +import japgolly.scalajs.react._ +import japgolly.scalajs.react.vdom.html_<^._ + +object PaginationView { + + case class Props(itemsCount: Int, + currentPage: Int, + pageSize: Int, + onPageChange: Int => Callback) + + class Backend($: BackendScope[Props, Unit]) { + def render(p: Props): VdomElement = { + val pageCount = (p.itemsCount + p.pageSize - 1) / p.pageSize + val first = if (p.currentPage == 0) "disabled" else "waves-effect" + val last = if (p.currentPage + 1 == pageCount) "disabled" else "waves-effect" + <.ul(^.className := "pagination", + <.li(^.className := first, + <.a(^.href := "#!", ^.onClick --> (if (p.currentPage == 0) Callback.empty else p.onPageChange(p.currentPage - 1)), + <.i(^.className := "material-icons", "chevron_left") + ) + ), + (0 until pageCount).toTagMod { i => + <.li(^.className := (if (i == p.currentPage) "active" else "waves-effect"), + ^.onClick --> (if (i == p.currentPage) Callback.empty else p.onPageChange(i)), + <.a(^.href := "#!", i + 1) + ) + }, + <.li(^.className := last, + <.a(^.href := "#!", ^.onClick --> (if (p.currentPage + 1 == pageCount) Callback.empty else p.onPageChange(p.currentPage + 1)), + <.i(^.className := "material-icons", "chevron_right") + ) + ) + ) + } + } + + val component = ScalaComponent.builder[Props]("PaginationView") + .stateless + .renderBackend[Backend] + .build + + def apply(props: Props) = component(props) +} diff --git a/front/src/main/scala/twitter/tweets/AddObjectView.scala b/front/src/main/scala/twitter/tweets/AddObjectView.scala new file mode 100644 index 0000000..1275f26 --- /dev/null +++ b/front/src/main/scala/twitter/tweets/AddObjectView.scala @@ -0,0 +1,116 @@ +package twitter.tweets + +import japgolly.scalajs.react._ +import japgolly.scalajs.react.vdom.html_<^._ +import org.scalajs.dom +import org.scalajs.dom.raw.HTMLInputElement +import twitter.AppCircuit +import twitter.shared.DateUtils +import twitter.tweets.TweetsRest.{HistorySource, NewObjectInfo, StreamSource, TweetSource} + +import scala.scalajs.js +import scala.scalajs.js.Date + +object AddObjectView { + + case class Props(info: NewObjectInfo, + progress: Boolean, + error: Option[String], + onQueryChange: String => Callback, + onTypeChange: String => Callback, + onSourceChange: TweetSource => Callback, + onSubmit: Callback) + + class Backend($: BackendScope[Props, Unit]) { + private def submit(onSubmit: Callback)(e: ReactEvent) = e.preventDefaultCB >> + onSubmit >> + CallbackTo.pure(false) + + def render(p: Props): VdomElement = { + val objectType = p.info.objectType + val source = p.info.source + <.div(^.className := "card", + <.div(^.className := "card-content", + <.form(^.onSubmit ==> submit(p.onSubmit), + <.h5(^.className := "title", "Nowy obiekt"), + <.div(^.className := "radio-group", + <.label( + <.input(^.`type` := "radio", ^.checked := objectType == NewObjectInfo.keywordType, ^.disabled := p.progress, + ^.onChange --> p.onTypeChange(NewObjectInfo.keywordType)), + <.span("Słowo kluczowe") + ), + <.label( + <.input(^.`type` := "radio", ^.checked := objectType == NewObjectInfo.userType, ^.disabled := p.progress, + ^.onChange --> p.onTypeChange(NewObjectInfo.userType)), + <.span("Użytkownik") + ) + ), + <.div(^.className := "input-field", + <.input(^.`type` := "text", ^.id := "query", ^.required := true, ^.disabled := p.progress, + ^.value := p.info.query, ^.onChange ==> { e: ReactEventFromInput => + p.onQueryChange(e.target.value) + }), + <.label(^.`for` := "query", if (objectType == NewObjectInfo.keywordType) "Słowo kluczowe" else "Użytkownik") + ), + <.div(^.className := "radio-group", + <.label( + <.input(^.`type` := "radio", ^.checked := source == StreamSource, ^.disabled := p.progress, + ^.onChange --> p.onSourceChange(StreamSource)), + <.span("Stream") + ), + <.label( + <.input(^.`type` := "radio", ^.checked := source != StreamSource, ^.disabled := p.progress, + ^.onChange --> p.onSourceChange(HistorySource(DateUtils.nowWithoutTime()))), + <.span("Batch") + ) + ), + p.info.source match { + case HistorySource(date) => + <.div(^.className := "input-field", + <.input(^.className := "datepicker", ^.`type` := "text", ^.id := "add-datepicker", ^.disabled := p.progress, + ^.defaultValue := DateUtils.showDate(date)), + <.label(^.`for` := "add-datepicker", "Pobierz historię od") + ) + case StreamSource => EmptyVdom + }, + p.error.whenDefined { e => + <.p(^.className := "red-text", e) + }, + <.button(^.className := "btn waves-effect", ^.`type` := "submit", ^.disabled := p.progress, "Dodaj") + ) + ) + ) + } + + private val M = js.Dynamic.global.M + + def update = Callback { + val elem = dom.document.querySelector("#add-datepicker").asInstanceOf[HTMLInputElement] + if (elem != null) { + val date = DateUtils.parseDate(elem.value) + M.Datepicker.init(elem, js.Dynamic.literal( + format = "dd-mm-yyyy", + firstDay = 1, + i18n = DateUtils.i18n, + onClose = () => { + val date = DateUtils.parseDate(elem.value) + AppCircuit.dispatch(ObjectSourceChanged(HistorySource(date.getOrElse(new Date)))) + }, + minDate = new Date(Date.now() - 6 * 24 * 60 * 60 * 1000), + maxDate = new Date() + )) + val instance = M.Datepicker.getInstance(elem) + instance.setDate(date.getOrElse(new Date())) + } + M.updateTextFields() + } + } + + val component = ScalaComponent.builder[Props]("AddObjectView") + .stateless + .renderBackend[Backend] + .componentDidUpdate(_.backend.update) + .build + + def apply(props: Props) = component(props) +} diff --git a/front/src/main/scala/twitter/tweets/ObjectDeleteView.scala b/front/src/main/scala/twitter/tweets/ObjectDeleteView.scala new file mode 100644 index 0000000..064aad0 --- /dev/null +++ b/front/src/main/scala/twitter/tweets/ObjectDeleteView.scala @@ -0,0 +1,53 @@ +package twitter.tweets + +import japgolly.scalajs.react._ +import japgolly.scalajs.react.vdom.html_<^._ +import org.scalajs.dom + +import scala.scalajs.js + +object ObjectDeleteView { + + case class Props(query: String, + isDeleted: Boolean, + deleteCheck: Boolean, + onDeleteCheck: Boolean => Callback, + onSubmit: Callback) + + class Backend($: BackendScope[Props, Unit]) { + def render(p: Props): VdomElement = { + <.div(^.className := "modal", ^.id := "delete-modal", + <.div(^.className := "modal-content", + <.h4("Potwierdź usunięcie"), + <.p(s"Czy na pewno chcesz usunąć obiekt ", <.i(p.query), " z listy śledzonych obiektów?"), + <.p( + <.label( + <.input(^.`type` := "checkbox", ^.checked := p.deleteCheck, ^.onChange --> p.onDeleteCheck(!p.deleteCheck)), + <.span("Usuń permanentnie") + ) + ).when(!p.isDeleted) + ), + <.div(^.className := "modal-footer", + <.a(^.className := "modal-action modal-close waves-effect waves-green btn-flat", ^.href := "#!", + ^.onClick --> p.onSubmit, "Tak"), + <.a(^.className := "modal-action modal-close waves-effect waves-red btn-flat", ^.href := "#!", "Nie") + ) + ) + } + + private val M = js.Dynamic.global.M + + val start = Callback { + val elem = dom.document.querySelector(".modal") + M.Modal.init(elem) + } + } + + val component = ScalaComponent.builder[Props]("ObjectDeleteView") + .stateless + .renderBackend[Backend] + .componentDidMount(_.backend.start) + .build + + def apply(props: Props) = component(props) +} diff --git a/front/src/main/scala/twitter/tweets/ObjectView.scala b/front/src/main/scala/twitter/tweets/ObjectView.scala new file mode 100644 index 0000000..305b1dc --- /dev/null +++ b/front/src/main/scala/twitter/tweets/ObjectView.scala @@ -0,0 +1,150 @@ +package twitter.tweets + +import cats.Functor +import cats.implicits._ +import diode.Action +import diode.data.Pot +import japgolly.scalajs.react._ +import japgolly.scalajs.react.vdom.html_<^._ +import org.scalajs.dom +import org.scalajs.dom.raw.HTMLInputElement +import twitter.AppCircuit +import twitter.shared.{DateUtils, LoadingView, PaginationView} +import twitter.tweets.TweetsRest.ObjectStats + +import scala.scalajs.js +import scala.scalajs.js.Date + +object ObjectView { + + case class Props(objectStats: Pot[ObjectStats], + from: Option[Date], + to: Option[Date], + currentPage: Int, + onFromChange: Date => Callback, + onToChange: Date => Callback, + onPageChange: Int => Callback) + + class Backend($: BackendScope[Props, Unit]) { + def render(p: Props): VdomElement = { + <.div(^.className := "card", + <.div(^.className := "card-content", + if (p.objectStats.nonEmpty) { + val pageSize = 10 + val objectStats = p.objectStats.get + val days = objectStats.days.sortBy(-_.date.getTime()).slice(p.currentPage * pageSize, (p.currentPage + 1) * pageSize) + val tweetsCount = objectStats.days.foldLeft(0)((acc, x) => acc + x.count) + val showDate: Option[Date] => Option[String] = Functor[Option].lift(x => DateUtils.showDate(x)) + <.div( + <.h5(^.className := "title", s"Zarządzaj obiektem ", <.i(objectStats.query)), + <.div( + <.div(^.className := "input-field no-padding-left col s6", + <.input(^.className := "datepicker", ^.`type` := "text", ^.id := "stats-from", + ^.value := showDate(p.from).getOrElse(""), ^.disabled := p.objectStats.isPending), + <.label(^.`for` := "stats-from", "Od") + ), + <.div(^.className := "input-field no-padding-right col s6", + <.input(^.className := "datepicker", ^.`type` := "text", ^.id := "stats-to", + ^.value := showDate(p.to).getOrElse(""), ^.disabled := p.objectStats.isPending), + <.label(^.`for` := "stats-to", "Do") + ) + ), + <.p(s"Sumaryczna liczba tweetów: ${objectStats.allTweets}"), + <.p(s"Liczba tweetów w wybranym okresie: $tweetsCount"), + if (objectStats.days.nonEmpty) { + <.div( + <.table(^.className := "bordered", + <.thead( + <.tr( + <.th("Data"), + <.th("Liczba tweetów") + ) + ), + <.tbody( + days.toTagMod { d => + <.tr( + <.td(d.date.toDateString()), + <.td(d.count) + ) + } + ) + ), + PaginationView(PaginationView.Props( + itemsCount = objectStats.days.size, + currentPage = p.currentPage, + pageSize = pageSize, + onPageChange = page => p.onPageChange(page) + )) + ) + } else { + <.br + }, + <.a(^.className := "waves-effect waves-light btn red modal-trigger", ^.href := "#delete-modal", ^.disabled := p.objectStats.isPending, "Usuń obiekt") + ) + } else { + EmptyVdom + }, + if (p.objectStats.isPending) { + <.div(^.className := "center loading", + LoadingView() + ) + } else { + EmptyVdom + }, + p.objectStats.exceptionOption.whenDefined { e => + <.div(^.className := "center loading red-text", e.getMessage) + } + ) + ) + } + + private val M = js.Dynamic.global.M + + def update = Callback { + def findElem(selector: String): HTMLInputElement = { + dom.document.querySelector(selector).asInstanceOf[HTMLInputElement] + } + val findElemOpt: Option[String] => Option[HTMLInputElement] = Functor[Option].lift(x => findElem(x)) + def elemDate(selector: Option[String]): Option[Date] = { + findElemOpt(selector).flatMap(elem => DateUtils.parseDate(elem.value).toOption) + } + def updateDatepicker(elem: HTMLInputElement, action: Option[Date] => Action, minSelector: Option[String] = None, + maxSelector: Option[String] = None): Unit = { + if (elem != null) { + val min = elemDate(minSelector) + val max = elemDate(maxSelector) + M.Datepicker.init(elem, js.Dynamic.literal( + format = "dd-mm-yyyy", + firstDay = 1, + i18n = DateUtils.i18n, + showClearBtn = true, + onClose = () => { + val date = DateUtils.parseDate(elem.value) + AppCircuit.dispatch(action(date.toOption)) + }, + minDate = min.orNull, + maxDate = DateUtils.min(max.getOrElse(new Date), new Date()) + )) + + val date = DateUtils.parseDate(elem.value) + val instance = M.Datepicker.getInstance(elem) + instance.setDate(date.getOrElse(new Date())) + } + } + + val fromElem = findElem("#stats-from") + updateDatepicker(fromElem, x => ObjectStatsFromChanged(x), maxSelector = Some("#stats-to")) + val toElem = findElem("#stats-to") + updateDatepicker(toElem, x => ObjectStatsToChanged(x), minSelector = Some("#stats-from")) + M.updateTextFields() + } + } + + val component = ScalaComponent.builder[Props]("ObjectView") + .stateless + .renderBackend[Backend] + .componentDidUpdate(_.backend.update) + .build + + def apply(props: Props) = component(props) +} diff --git a/front/src/main/scala/twitter/tweets/TweetsListView.scala b/front/src/main/scala/twitter/tweets/TweetsListView.scala new file mode 100644 index 0000000..d110e84 --- /dev/null +++ b/front/src/main/scala/twitter/tweets/TweetsListView.scala @@ -0,0 +1,69 @@ +package twitter.tweets + +import diode.data.Pot +import japgolly.scalajs.react._ +import japgolly.scalajs.react.vdom.html_<^._ +import twitter.shared.{LoadingView, PaginationView} +import twitter.tweets.TweetsRest.TweetListItem + +object TweetsListView { + + case class Props(tweets: Pot[Seq[TweetListItem]], + selectedTweet: Option[Int], + currentPage: Int, + onTweetSelected: Int => Callback, + onPageChanged: Int => Callback) + + class Backend($: BackendScope[Props, Unit]) { + def render(p: Props): VdomElement = { + val pageSize = 10 + lazy val tweets = p.tweets.get.slice(p.currentPage * pageSize, (p.currentPage + 1) * pageSize) + <.div(^.className := "card", + <.div(^.className := "collection with-header", + <.div(^.className := "collection-header", + <.h5("Śledzone obiekty") + ), + if (p.tweets.nonEmpty) { + tweets.toTagMod { tweet => + val sourceIcon = if (tweet.source == "stream") "autorenew" else "history" + val typeIcon = if (tweet.objectType == "user") "person" else "description" + <.a(^.classSet1("collection-item", "active" -> p.selectedTweet.contains(tweet.id)), + ^.href := "#!", ^.onClick --> p.onTweetSelected(tweet.id), + if (tweet.deleted) <.span(^.className := "new badge red", vdomAttrVtString("data-badge-caption", ""), "Usunięto") else EmptyVdom, + <.i(^.className := "material-icons left", sourceIcon), + <.i(^.className := "material-icons left", typeIcon), + tweet.query + ) + } + } else if (p.tweets.isPending) { + <.div(^.className := "center loading", LoadingView()) + } else { + EmptyVdom + }, + p.tweets.exceptionOption.whenDefined { e => + <.div(^.className := "center loading red-text", e.getMessage) + }, + if (p.tweets.nonEmpty && tweets.nonEmpty) { + <.div( + PaginationView(PaginationView.Props( + itemsCount = p.tweets.get.size, + currentPage = p.currentPage, + pageSize = pageSize, + onPageChange = p.onPageChanged + )) + ) + } else { + EmptyVdom + } + ) + ) + } + } + + val component = ScalaComponent.builder[Props]("TweetsListView") + .stateless + .renderBackend[Backend] + .build + + def apply(props: Props) = component(props) +} diff --git a/front/src/main/scala/twitter/tweets/TweetsModel.scala b/front/src/main/scala/twitter/tweets/TweetsModel.scala new file mode 100644 index 0000000..c087221 --- /dev/null +++ b/front/src/main/scala/twitter/tweets/TweetsModel.scala @@ -0,0 +1,180 @@ +package twitter.tweets + +import diode.data.PotState._ +import diode.data.{Empty, Pot, PotAction} +import diode.{Action, ActionHandler, Effect, ModelRW} +import twitter.tweets.TweetsRest.{NewObjectInfo, ObjectStats, StreamSource, TweetListItem, TweetSource} + +import scala.concurrent.ExecutionContext.Implicits.global +import scala.concurrent.Future +import scala.scalajs.js.Date + +case class TweetsModel(credentials: Option[String], + tweets: Pot[Seq[TweetListItem]], + newObjectInfo: NewObjectInfo, + newObjectProgress: Boolean, + newObjectError: Option[String], + selectedObjectId: Option[Int], + listCurrentPage: Int, + objectStats: Pot[ObjectStats], + objectStatsFrom: Option[Date], + objectStatsTo: Option[Date], + statsCurrentPage: Int, + objectDeleteAll: Boolean) + +object TweetsModel { + val initModel = TweetsModel( + credentials = None, + tweets = Pot.empty, + newObjectInfo = NewObjectInfo("", "keyword", StreamSource), + newObjectProgress = false, + newObjectError = None, + selectedObjectId = None, + listCurrentPage = 0, + objectStats = Pot.empty, + objectStatsFrom = None, + objectStatsTo = None, + statsCurrentPage = 0, + objectDeleteAll = false, + ) +} + +case class LoginSuccessful(credentials: String) extends Action +case object ClearCredentials extends Action + +case class UpdateTweetsList(potResult: Pot[Seq[TweetListItem]] = Empty) + extends PotAction[Seq[TweetListItem], UpdateTweetsList] { + override def next(newResult: Pot[Seq[TweetListItem]]) = UpdateTweetsList(newResult) +} +case class SelectObject(id: Int) extends Action +case class ListPageChanged(page: Int) extends Action + +case class ObjectQueryChanged(query: String) extends Action +case class ObjectTypeChanged(tweetType: String) extends Action +case class ObjectSourceChanged(tweetSource: TweetSource) extends Action +case object ObjectSubmit extends Action +case class NewObjectError(error: String) extends Action +case object NewObjectSuccessful extends Action + +case class UpdateObjectStats(objectId: Int, + from: Option[Date] = None, + to: Option[Date] = None, + potResult: Pot[ObjectStats] = Empty, + ) extends PotAction[ObjectStats, UpdateObjectStats] { + override def next(newResult: Pot[ObjectStats]): UpdateObjectStats = UpdateObjectStats(objectId, from, to, newResult) +} +case class ObjectStatsFromChanged(date: Option[Date]) extends Action +case class ObjectStatsToChanged(date: Option[Date]) extends Action +case class StatsPageChanged(page: Int) extends Action +case class ObjectDeleteAllChanged(all: Boolean) extends Action +case class ObjectDelete(objectId: Int) extends Action + +class TweetsHandler[M](modelRW: ModelRW[M, TweetsModel]) extends ActionHandler(modelRW) { + override def handle = { + case LoginSuccessful(credentials) => + val effect = Effect(Future.successful(UpdateTweetsList())) + updated(TweetsModel.initModel.copy(credentials = Some(credentials)), effect) + case ClearCredentials => + updated(value.copy(credentials = None)) + case action: UpdateTweetsList => + val effect = action.effect(TweetsRest.tweetsList(value.credentials.getOrElse("")))(identity) + action.handle { + case PotEmpty => + updated(value.copy(tweets = value.tweets.pending()), effect) + case PotPending => + noChange + case PotReady => + updated(value.copy(tweets = action.potResult)) + case PotUnavailable => + updated(value.copy(tweets = value.tweets.unavailable())) + case PotFailed => + val e = action.result.failed.get + updated(value.copy(tweets = value.tweets.fail(e))) + } + case SelectObject(id) => + value.selectedObjectId match { + case Some(i) if i == id => + updated(value.copy( + selectedObjectId = None, + objectStats = Pot.empty + )) + case _ => + val effect = Effect(Future.successful(UpdateObjectStats(id))) + updated(value.copy( + selectedObjectId = Some(id), + objectStatsFrom = None, + objectStatsTo = None, + objectDeleteAll = false + ), effect) + } + case ListPageChanged(p) => + updated(value.copy(listCurrentPage = p)) + case ObjectQueryChanged(v) => + updated(value.copy(newObjectInfo = value.newObjectInfo.copy(query = v))) + case ObjectTypeChanged(v) => + updated(value.copy(newObjectInfo = value.newObjectInfo.copy(objectType = v))) + case ObjectSourceChanged(v) => + updated(value.copy(newObjectInfo = value.newObjectInfo.copy(source = v))) + case ObjectSubmit => + val effect = Effect(TweetsRest.newObject(value.credentials.getOrElse(""), value.newObjectInfo) + .map { + case Left(e) => NewObjectError(e.getMessage) + case Right(_) => NewObjectSuccessful + }) + updated(value.copy(newObjectProgress = true), effect) + case NewObjectError(e) => + updated(value.copy(newObjectProgress = false, newObjectError = Some(e))) + case NewObjectSuccessful => + val effect = Effect(Future.successful(UpdateTweetsList())) + updated(value.copy( + newObjectInfo = TweetsModel.initModel.newObjectInfo, + newObjectProgress = false, + newObjectError = None + ), effect) + case action: UpdateObjectStats => + val effect = action.effect( + TweetsRest.objectStats(value.credentials.getOrElse(""), action.objectId, action.from, action.to) + )(identity) + action.handle { + case PotEmpty => + updated(value.copy(objectStats = value.objectStats.pending()), effect) + case PotPending => + noChange + case PotReady => + if (value.selectedObjectId.contains(action.potResult.get.id)) { + updated(value.copy(objectStats = action.potResult)) + } else { + noChange + } + case PotUnavailable => + updated(value.copy(objectStats = value.objectStats.unavailable())) + case PotFailed => + val e = action.result.failed.get + updated(value.copy(objectStats = value.objectStats.fail(e))) + } + case ObjectStatsFromChanged(date) => + val effect = Effect(Future.successful(UpdateObjectStats( + objectId = value.selectedObjectId.getOrElse(0), + from = date, + to = value.objectStatsTo + ))) + updated(value.copy(objectStatsFrom = date), effect) + case ObjectStatsToChanged(date) => + val effect = Effect(Future.successful(UpdateObjectStats( + objectId = value.selectedObjectId.getOrElse(0), + from = value.objectStatsFrom, + to = date + ))) + updated(value.copy(objectStatsTo = date), effect) + case StatsPageChanged(p) => + updated(value.copy(statsCurrentPage = p)) + case ObjectDeleteAllChanged(all) => + updated(value.copy(objectDeleteAll = all)) + case ObjectDelete(id) => + val isDeleted = value.objectStats.toOption.exists(_.deleted) + val effect = Effect(Future.successful(SelectObject(id))) >> + Effect(TweetsRest.deleteObject(value.credentials.getOrElse(""), id, value.objectDeleteAll || isDeleted) + .map(_ => UpdateTweetsList())) + updated(value, effect) + } +} diff --git a/front/src/main/scala/twitter/tweets/TweetsRest.scala b/front/src/main/scala/twitter/tweets/TweetsRest.scala new file mode 100644 index 0000000..246da9b --- /dev/null +++ b/front/src/main/scala/twitter/tweets/TweetsRest.scala @@ -0,0 +1,114 @@ +package twitter.tweets + +import cats.implicits._ +import io.circe.generic.auto._ +import io.circe.parser.decode +import io.circe.syntax._ +import io.circe.{Decoder, Encoder, HCursor, Json} +import org.scalajs.dom.ext.Ajax +import org.scalajs.dom.ext.Ajax.InputData +import twitter.MainApp +import twitter.login.LoginRest.{AjaxFuture, MessageInfo, authorizationHeader} + +import scala.concurrent.ExecutionContext.Implicits.global +import scala.concurrent.Future +import scala.scalajs.js.Date + +object TweetsRest { + + case class TweetListItem(id: Int, source: String, objectType: String, query: String, deleted: Boolean) + + def tweetsList(credentials: String): Future[Seq[TweetListItem]] = { + val url = s"${MainApp.apiUrl}/objects" + val headers = authorizationHeader(credentials) + Ajax.get(url, headers = headers) + .map(r => decode[Seq[TweetListItem]](r.responseText)) + .recoverAjax() + .flatMap { + case Right(xs) => Future.successful(xs) + case Left(e) => Future.failed(e) + } + } + + sealed trait TweetSource + case object StreamSource extends TweetSource + case class HistorySource(history: Date) extends TweetSource + + case class NewObjectInfo(query: String, objectType: String, source: TweetSource) + + object NewObjectInfo { + val userType = "user" + val keywordType = "keyword" + } + + implicit val encodeNewObjectInfo: Encoder[NewObjectInfo] = + (a: NewObjectInfo) => { + a.source match { + case StreamSource => + Json.obj( + ("source", Json.fromString("stream")), + ("objectType", Json.fromString(a.objectType)), + ("query", Json.fromString(a.query)) + ) + case HistorySource(history) => + Json.obj( + ("source", Json.fromString("history")), + ("objectType", Json.fromString(a.objectType)), + ("history", Json.fromString(history.toUTCString())), + ("query", Json.fromString(a.query)) + ) + } + } + + def newObject(credentials: String, tweet: NewObjectInfo): Future[Either[Exception, MessageInfo]] = { + val url = s"${MainApp.apiUrl}/objects" + val headers = authorizationHeader(credentials) + val json = tweet.asJson.noSpaces + Ajax.post(url, headers = headers, data = InputData.str2ajax(json)) + .map(r => decode[MessageInfo](r.responseText)) + .recoverAjax() + } + + case class DayStats(date: Date, count: Int) + + case class ObjectStats(id: Int, query: String, deleted: Boolean, allTweets: Int, days: Seq[DayStats]) + + implicit val decodeDayStats: Decoder[DayStats] = + (c: HCursor) => for { + date <- c.downField("date").as[String] + count <- c.downField("count").as[Int] + } yield DayStats(new Date(Date.parse(date)), count) + + def addParamsToUrl(url: String, params: List[(String, String)], first: Boolean = true): String = params match { + case Nil => url + case (p, v) :: t => addParamsToUrl(s"$url${if (first) "?" else "&"}$p=$v", t, first = false) + } + + def objectStats(credentials: String, objectId: Int, from: Option[Date] = None, to: Option[Date] = None): Future[ObjectStats] = { + val params = List( + from.map(x => ("from", x.toUTCString())), + to.map(x => ("to", new Date(x.getTime() + 24 * 60 * 60 * 1000).toUTCString())) + ).flatten + val url = addParamsToUrl(s"${MainApp.apiUrl}/objects/$objectId", params) + val headers = authorizationHeader(credentials) + Ajax.get(url, headers = headers) + .map(r => decode[ObjectStats](r.responseText)) + .recoverAjax() + .flatMap { + case Right(xs) => Future.successful(xs) + case Left(e) => Future.failed(e) + } + } + + def deleteObject(credentials: String, objectId: Int, all: Boolean): Future[MessageInfo] = { + val url = addParamsToUrl(s"${MainApp.apiUrl}/objects/$objectId", List(("all", all.show))) + val headers = authorizationHeader(credentials) + Ajax.delete(url, headers = headers) + .map(r => decode[MessageInfo](r.responseText)) + .recoverAjax() + .flatMap { + case Right(xs) => Future.successful(xs) + case Left(e) => Future.failed(e) + } + } +} diff --git a/front/src/main/scala/twitter/tweets/TweetsView.scala b/front/src/main/scala/twitter/tweets/TweetsView.scala new file mode 100644 index 0000000..ad97550 --- /dev/null +++ b/front/src/main/scala/twitter/tweets/TweetsView.scala @@ -0,0 +1,67 @@ +package twitter.tweets + +import diode.Action +import diode.data.PotState.PotEmpty +import japgolly.scalajs.react._ +import japgolly.scalajs.react.vdom.html_<^._ +import twitter.shared.LoadingView + +object TweetsView { + + case class Props(tweetsModel: TweetsModel, dispatch: Action => Callback) + + class Backend($: BackendScope[Props, Unit]) { + def render(p: Props): VdomElement = { + <.div(^.className := "row", + <.div(^.className := "col s6", + AddObjectView(AddObjectView.Props( + info = p.tweetsModel.newObjectInfo, + progress = p.tweetsModel.newObjectProgress, + error = p.tweetsModel.newObjectError, + onQueryChange = x => p.dispatch(ObjectQueryChanged(x)), + onTypeChange = x => p.dispatch(ObjectTypeChanged(x)), + onSourceChange = x => p.dispatch(ObjectSourceChanged(x)), + onSubmit = p.dispatch(ObjectSubmit) + )), + TweetsListView(TweetsListView.Props( + tweets = p.tweetsModel.tweets, + selectedTweet = p.tweetsModel.selectedObjectId, + currentPage = p.tweetsModel.listCurrentPage, + onTweetSelected = id => p.dispatch(SelectObject(id)), + onPageChanged = page => p.dispatch(ListPageChanged(page)) + )) + ), + <.div(^.className := "col s6", + if (p.tweetsModel.objectStats.state == PotEmpty) { + EmptyVdom + } else { + ObjectView(ObjectView.Props( + objectStats = p.tweetsModel.objectStats, + from = p.tweetsModel.objectStatsFrom, + to = p.tweetsModel.objectStatsTo, + currentPage = p.tweetsModel.statsCurrentPage, + onFromChange = _ => Callback.empty, + onToChange = _ => Callback.empty, + onPageChange = page => p.dispatch(StatsPageChanged(page)) + )) + } + ), + ObjectDeleteView(ObjectDeleteView.Props( + query = p.tweetsModel.objectStats.toOption.map(_.query).getOrElse(""), + isDeleted = p.tweetsModel.objectStats.toOption.exists(_.deleted), + deleteCheck = p.tweetsModel.objectDeleteAll, + onDeleteCheck = x => p.dispatch(ObjectDeleteAllChanged(x)), + onSubmit = p.dispatch(ObjectDelete(p.tweetsModel.selectedObjectId.getOrElse(0))) + )) + ) + } + } + + val component = ScalaComponent.builder[Props]("TweetsView") + .stateless + .renderBackend[Backend] + .build + + def apply(tweetsModel: TweetsModel, dispatch: Action => Callback) = + component(Props(tweetsModel, dispatch)) +} diff --git a/misc/screenshots/screen1.png b/misc/screenshots/screen1.png new file mode 100644 index 0000000000000000000000000000000000000000..791be53e09de6483170d9687fed9255a1790f1b7 GIT binary patch literal 67249 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

gqUvc=2$Ym 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 E1H&>eO#lD@ literal 0 HcmV?d00001 diff --git a/twitter-saver/config.go b/twitter-saver/config.go new file mode 100644 index 0000000..d99ad73 --- /dev/null +++ b/twitter-saver/config.go @@ -0,0 +1,30 @@ +package main + +import ( + "io/ioutil" + + "gitlab.com/kompu/twitter-saver/core" + "gopkg.in/yaml.v2" +) + +type Config struct { + Db core.DbConfig + Twitter core.TwitterConfig + Json core.JsonConfig + AutoDeleteDays *int `yaml:"autoDeleteDays"` +} + +func readConfig(path *string) (*Config, error) { + data, err := ioutil.ReadFile(*path) + if err != nil { + return nil, err + } + + config := Config{} + err = yaml.Unmarshal(data, &config) + if err != nil { + return nil, err + } + + return &config, nil +} diff --git a/twitter-saver/config.yaml b/twitter-saver/config.yaml new file mode 100644 index 0000000..81b9df2 --- /dev/null +++ b/twitter-saver/config.yaml @@ -0,0 +1,19 @@ +db: + host: + port: + user: + password: + dbName: + sslMode: disable +twitter: + consumerKey: + consumerSecret: + token: + tokenSecret: +json: + all: false + fields: + - truncated + - user.name + - user.entities +autoDeleteDays: null diff --git a/twitter-saver/history.go b/twitter-saver/history.go new file mode 100644 index 0000000..f4dce70 --- /dev/null +++ b/twitter-saver/history.go @@ -0,0 +1,100 @@ +package main + +import ( + "log" + "sync" + "time" + + "github.com/dghubble/go-twitter/twitter" + "github.com/jinzhu/gorm" + "gitlab.com/kompu/twitter-saver/core" +) + +type SafeFlag struct { + v bool + mux sync.Mutex +} + +func (f *SafeFlag) SetFlag(v bool) { + f.mux.Lock() + f.v = v + f.mux.Unlock() +} + +func (f *SafeFlag) CheckFlag() bool { + f.mux.Lock() + defer f.mux.Unlock() + return f.v +} + +func startDownloadingHistory(config *Config, db *gorm.DB, client *twitter.Client, downloading *SafeFlag) { + if downloading.CheckFlag() { + log.Println("Already downloading history.") + return + } + + downloading.SetFlag(true) + if config.AutoDeleteDays != nil { + log.Println("Removing old tweets.") + days := time.Duration(*config.AutoDeleteDays) + date := time.Now().Add(days * -24 * time.Hour) + err := core.RemoveTweetsOlderThan(db, date) + if err != nil { + log.Println(err) + } + } + + log.Println("Started downloading history objects.") + + objects := core.FindHistoryObjects(db) + for _, object := range objects { + var date *time.Time + var sinceId int64 + if object.HistoryFrom != nil && !object.HistoryDone { + date = object.HistoryFrom + } else { + var err error + sinceId, err = core.LatestTweetForObject(db, object.ID) + if err != nil { + log.Println("Error getting from object", object.ID, "latest sinceId:", err) + } + } + + var query string + if object.Type == core.UserType { + query = "from:" + object.Query + } else { + query = object.Query + } + log.Printf("Downloading history for '%s'", query) + + lastMaxId := int64(0) + for { + results, maxId, err := searchSince(client, query, date, sinceId, lastMaxId) + for _, tweet := range results { + err := core.InsertTweet(db, &tweet, object.ID, config.Json.Fields, config.Json.All) + if err != nil { + log.Println("Json storing error for history object", query, ":", err) + } + } + + if err != nil { + log.Println("Error downloading history for", query, ":", err) + } else if object.HistoryFrom != nil && !object.HistoryDone { + core.UpdateObjectHistory(db, &object, true) + } + + if maxId != 0 { + log.Println("Limit exceeded for history object", query) + time.Sleep(15 * time.Minute) + log.Println("Resuming downloading", query) + lastMaxId = maxId + } else { + break + } + } + } + + log.Println("Finished downloading history objects.") + downloading.SetFlag(false) +} diff --git a/twitter-saver/main.go b/twitter-saver/main.go new file mode 100644 index 0000000..b638855 --- /dev/null +++ b/twitter-saver/main.go @@ -0,0 +1,51 @@ +package main + +import ( + "flag" + "log" + "os" + "os/signal" + "syscall" + + "github.com/robfig/cron" + "gitlab.com/kompu/twitter-saver/core" +) + +func main() { + configPath := flag.String("config", "config.yaml", "Path to config file") + flag.Parse() + + conf, err := readConfig(configPath) + if err != nil { + log.Fatalln(err) + } + + conn, err := conf.Db.ConnectionString() + if err != nil { + log.Fatalln(err) + } + db := core.Connect(conn) + defer db.Close() + + client, err := conf.Twitter.TwitterClient() + if err != nil { + log.Fatalln(err) + } + + downloading := SafeFlag{v: false} + + scheduler := cron.New() + scheduler.AddFunc("0 0 0 * * *", func() { + startDownloadingHistory(conf, db, client, &downloading) + }) + scheduler.Start() + + go startStreaming(conf, db, client) + go startDownloadingHistory(conf, db, client, &downloading) + + exitSignal := make(chan os.Signal) + signal.Notify(exitSignal, syscall.SIGINT, syscall.SIGTERM) + <-exitSignal + + scheduler.Stop() +} diff --git a/twitter-saver/search.go b/twitter-saver/search.go new file mode 100644 index 0000000..2f953e1 --- /dev/null +++ b/twitter-saver/search.go @@ -0,0 +1,60 @@ +package main + +import ( + "time" + + "github.com/dghubble/go-twitter/twitter" +) + +func min(a, b int64) int64 { + if a < b { + return a + } + return b +} + +func limitExceeded(apiError *twitter.APIError) bool { + for _, err := range apiError.Errors { + if err.Code == 88 { + return true + } + } + return false +} + +func searchSince(client *twitter.Client, query string, date *time.Time, sinceId int64, maxId int64) ([]twitter.Tweet, int64, error) { + results := make([]twitter.Tweet, 0) + + for { + search, _, err := client.Search.Tweets(&twitter.SearchTweetParams{ + Query: query, + Count: 100, + MaxID: maxId, + SinceID: sinceId, + }) + if apiErr, ok := err.(twitter.APIError); ok && limitExceeded(&apiErr) { + return results, maxId, nil + } + if err != nil { + return results, 0, err + } + if len(search.Statuses) == 0 { + return results, 0, nil + } + + if maxId == 0 { + maxId = search.Statuses[0].ID - 1 + } + for _, tweet := range search.Statuses { + maxId = min(maxId, tweet.ID-1) + t, err := time.Parse(time.RubyDate, tweet.CreatedAt) + if err != nil { + return results, 0, err + } + if date != nil && t.Before(*date) { + return results, 0, nil + } + results = append(results, tweet) + } + } +} diff --git a/twitter-saver/stream.go b/twitter-saver/stream.go new file mode 100644 index 0000000..49a5c12 --- /dev/null +++ b/twitter-saver/stream.go @@ -0,0 +1,147 @@ +package main + +import ( + "log" + "time" + + "github.com/dghubble/go-twitter/twitter" + "github.com/jinzhu/gorm" + "gitlab.com/kompu/twitter-saver/core" +) + +type StreamInfo struct { + ID uint + Type core.ObjectType + Query string +} + +type Streams map[StreamInfo]chan int + +func streamsToRemove(running Streams, newObjects []core.Object) []StreamInfo { + newInfo := make(map[StreamInfo]bool) + for _, v := range newObjects { + newInfo[StreamInfo{ID: v.ID, Type: v.Type, Query: v.Query}] = true + } + + rem := make([]StreamInfo, 0) + for k := range running { + _, ok := newInfo[k] + if !ok { + rem = append(rem, k) + } + } + return rem +} + +func streamsToAdd(running Streams, newObjects []core.Object) []StreamInfo { + add := make([]StreamInfo, 0) + for _, v := range newObjects { + s := StreamInfo{ID: v.ID, Type: v.Type, Query: v.Query} + _, ok := running[s] + if !ok { + add = append(add, s) + } + } + return add +} + +func startStream(config *Config, db *gorm.DB, client *twitter.Client, info StreamInfo, + quit <-chan int, errors chan<- StreamInfo) { + log.Println("Starting stream", info) + + var query string + if info.Type == core.UserType { + query = "from:" + info.Query + } else { + query = info.Query + } + params := &twitter.StreamFilterParams{ + Track: []string{query}, + StallWarnings: twitter.Bool(true), + } + + stream, err := client.Streams.Filter(params) + if err != nil { + log.Println("Stream error:", err) + errors <- info + return + } + + demux := twitter.NewSwitchDemux() + demux.Tweet = func(tweet *twitter.Tweet) { + err := core.InsertTweet(db, tweet, info.ID, config.Json.Fields, config.Json.All) + if err != nil { + log.Println("Json storing error for stream", info, ":", err) + } + } + demux.Warning = func(warning *twitter.StallWarning) { + log.Println("Stream", info, "is falling behind. Warning code:", + warning.Code, ", message: ", warning.Message) + } + demux.StreamLimit = func(limit *twitter.StreamLimit) { + log.Println("Stream", info, "reached limit,", + limit.Track, "undelivered matches.") + errors <- info + stream.Stop() + return + } + demux.StreamDisconnect = func(disconnect *twitter.StreamDisconnect) { + log.Println("Stream", info, "disconnected. Disconection code:", + disconnect.Code, ", reason:", disconnect.Reason) + errors <- info + stream.Stop() + return + } + + for { + select { + case message := <-stream.Messages: + demux.Handle(message) + case <-quit: + log.Println("Stoping stream", info) + stream.Stop() + return + } + } +} + +func startStreaming(config *Config, db *gorm.DB, client *twitter.Client) { + running := make(Streams) + errors := make(chan StreamInfo) + ticker := time.NewTicker(60 * time.Second) + + work := func() { + streams := core.FindStreamObjects(db) + rem := streamsToRemove(running, streams) + add := streamsToAdd(running, streams) + + if len(add) > 0 { + log.Println("Streams to add:", add) + } + if len(rem) > 0 { + log.Println("Streams to remove:", rem) + } + + for _, v := range rem { + quit := running[v] + quit <- 0 + delete(running, v) + } + + for _, v := range add { + quit := make(chan int) + running[v] = quit + go startStream(config, db, client, v, quit, errors) + } + } + work() + + for { + select { + case v := <-errors: + delete(running, v) + case <-ticker.C: + work() + } + } +} diff --git a/web/config.go b/web/config.go new file mode 100644 index 0000000..4e64fbf --- /dev/null +++ b/web/config.go @@ -0,0 +1,28 @@ +package main + +import ( + "io/ioutil" + + "gitlab.com/kompu/twitter-saver/core" + "gopkg.in/yaml.v2" +) + +type Config struct { + Db core.DbConfig + Web core.WebConfig +} + +func readConfig(path *string) (*Config, error) { + data, err := ioutil.ReadFile(*path) + if err != nil { + return nil, err + } + + config := Config{} + err = yaml.Unmarshal(data, &config) + if err != nil { + return nil, err + } + + return &config, nil +} diff --git a/web/config.yaml b/web/config.yaml new file mode 100644 index 0000000..d479a54 --- /dev/null +++ b/web/config.yaml @@ -0,0 +1,15 @@ +db: + host: + port: + user: + password: + dbName: + sslMode: disable +web: + port: 8080 + secret: + users: + - username: admin + password: admin + - username: test + password: test diff --git a/web/main.go b/web/main.go new file mode 100644 index 0000000..31564eb --- /dev/null +++ b/web/main.go @@ -0,0 +1,130 @@ +package main + +import ( + "flag" + "fmt" + "log" + "net/http" + "strconv" + "time" + + jwt "github.com/appleboy/gin-jwt" + "github.com/gin-gonic/gin" + "gitlab.com/kompu/twitter-saver/core" +) + +func main() { + configPath := flag.String("config", "config.yaml", "Path to config file") + flag.Parse() + + conf, err := readConfig(configPath) + if err != nil { + log.Fatalln(err) + } + if conf.Web.Port == nil { + log.Fatalln("Web server port not specified.") + } + if conf.Web.Secret == nil { + log.Fatalln("Web secret key not specified.") + } + + accounts, err := conf.Web.WebAccounts() + if err != nil { + log.Fatalln(err) + } + + conn, err := conf.Db.ConnectionString() + if err != nil { + log.Fatalln(err) + } + db := core.Connect(conn) + defer db.Close() + + r := gin.Default() + + r.Static("/assets", "./public") + r.StaticFile("/", "./public/index.html") + + authMiddleware := jwt.GinJWTMiddleware{ + Realm: "twitter-saver", + Key: []byte(*conf.Web.Secret), + Timeout: 24 * time.Hour, + MaxRefresh: 7 * 24 * time.Hour, + Authenticator: func(userId string, password string, c *gin.Context) (string, bool) { + if pass, ok := accounts[userId]; ok { + return userId, pass == password + } + return userId, false + }, + } + + authorized := r.Group("/api") + + authorized.POST("/login", authMiddleware.LoginHandler) + + authorized.Use(authMiddleware.MiddlewareFunc()) + + authorized.GET("/refresh_token", authMiddleware.RefreshHandler) + + authorized.GET("/objects", func(c *gin.Context) { + objects := listObjects(db) + c.JSON(http.StatusOK, objects) + }) + authorized.POST("/objects", func(c *gin.Context) { + var json ObjectAdd + if err := c.ShouldBindJSON(&json); err == nil { + err := addObject(db, &json) + if err != nil { + if err.Error() == "Two streams already exist." { + c.JSON(http.StatusNotAcceptable, gin.H{"error": err.Error()}) + } else { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + } + } else { + c.JSON(http.StatusOK, gin.H{"message": "ok"}) + } + } else { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + } + }) + + authorized.GET("/objects/:id", func(c *gin.Context) { + idStr := c.Param("id") + id, err := strconv.Atoi(idStr) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "Wrong 'id' format"}) + return + } + from := c.DefaultQuery("from", "") + to := c.DefaultQuery("to", "") + stats, err := objectStats(db, id, from, to) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + c.JSON(http.StatusOK, stats) + }) + authorized.DELETE("/objects/:id", func(c *gin.Context) { + idStr := c.Param("id") + allStr := c.DefaultQuery("all", "false") + id, err := strconv.ParseUint(idStr, 10, 64) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "Wrong 'id' format"}) + return + } + all, err := strconv.ParseBool(allStr) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "Wrong 'all' format"}) + return + } + err = deleteObject(db, uint(id), all) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + } else { + c.JSON(http.StatusOK, gin.H{"message": "ok"}) + } + }) + + addr := fmt.Sprintf(":%d", *conf.Web.Port) + r.Run(addr) +} diff --git a/web/objects.go b/web/objects.go new file mode 100644 index 0000000..95c498e --- /dev/null +++ b/web/objects.go @@ -0,0 +1,254 @@ +package main + +import ( + "database/sql" + "errors" + "fmt" + "sort" + "time" + + "github.com/jinzhu/gorm" + "gitlab.com/kompu/twitter-saver/core" +) + +type ObjectList struct { + ID uint `json:"id"` + Source string `json:"source"` + Type string `json:"objectType"` + Query string `json:"query"` + Deleted bool `json:"deleted"` +} + +func objectSource(source core.ObjectSource) string { + switch source { + case core.HistorySource: + return "history" + case core.StreamSource: + return "stream" + default: + return "unknown" + } +} + +func toObjectSource(str string) (core.ObjectSource, error) { + switch str { + case "history": + return core.HistorySource, nil + case "stream": + return core.StreamSource, nil + default: + return 0, errors.New("Unknown source " + str) + } +} + +func objectType(objectType core.ObjectType) string { + switch objectType { + case core.UserType: + return "user" + case core.KeywordType: + return "keyword" + default: + return "unknown" + } +} + +func toObjectType(str string) (core.ObjectType, error) { + switch str { + case "user": + return core.UserType, nil + case "keyword": + return core.KeywordType, nil + default: + return 0, errors.New("Unknown type " + str) + } +} + +type byCreatedAt []core.Object + +func (s byCreatedAt) Len() int { + return len(s) +} +func (s byCreatedAt) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} +func (s byCreatedAt) Less(i, j int) bool { + return s[i].CreatedAt.After(s[j].CreatedAt) +} + +func listObjects(db *gorm.DB) []ObjectList { + objects := core.FindAllObjects(db) + sort.Sort(byCreatedAt(objects)) + + res := make([]ObjectList, len(objects)) + for i, v := range objects { + res[i] = ObjectList{ + ID: v.ID, + Source: objectSource(v.Source), + Type: objectType(v.Type), + Query: v.Query, + Deleted: v.DeletedAt != nil, + } + } + return res +} + +type ObjectAdd struct { + Source string `json:"source" binding:"required"` + Type string `json:"objectType" binding:"required"` + Query string `json:"query" binding:"required"` + History string `json:"history"` +} + +func addObject(db *gorm.DB, object *ObjectAdd) error { + source, err := toObjectSource(object.Source) + if err != nil { + return err + } + + typ, err := toObjectType(object.Type) + if err != nil { + return err + } + + if source == core.StreamSource { + count := core.CountStreamObjects(db) + if count >= 2 { + return errors.New("Two streams already exist.") + } + } + + if object.History != "" { + history, err := time.Parse(time.RFC1123, object.History) + if err != nil { + return err + } + db.Create(&core.Object{ + Source: source, + Type: typ, + Query: object.Query, + HistoryFrom: &history, + }) + } else { + db.Create(&core.Object{ + Source: source, + Type: typ, + Query: object.Query, + }) + } + + return nil +} + +func deleteObject(db *gorm.DB, id uint, all bool) error { + var object core.Object + db.Unscoped().First(&object, id) + if object.ID == id { + if all { + db.Unscoped().Delete(&object) + } else { + db.Delete(&object) + } + return nil + } else { + return errors.New(fmt.Sprintf("Object with id=%d doesn't exist.", id)) + } +} + +type DayStats struct { + Date string `json:"date"` + Count int `json:"count"` +} + +type ObjectStats struct { + ID int `json:"id"` + Query string `json:"query"` + Deleted bool `json:"deleted"` + AllTweets int `json:"allTweets"` + Days []DayStats `json:"days"` +} + +func objectStats(db *gorm.DB, id int, from string, to string) (*ObjectStats, error) { + var obj core.Object + db.Unscoped().First(&obj, id) + + var allCount int + db.Model(&core.Tweet{}).Where("object_id = ?", id).Count(&allCount) + + var rows *sql.Rows + var err error + + if from != "" && to != "" { + fromTime, err := time.Parse(time.RFC1123, from) + if err != nil { + return nil, err + } + toTime, err := time.Parse(time.RFC1123, to) + if err != nil { + return nil, err + } + rows, err = db.Raw(`SELECT (published_at AT TIME ZONE 'Europe/Warsaw')::date, COUNT(*) + FROM tweets + WHERE object_id = ? AND published_at >= ? AND published_at <= ? + GROUP BY 1 ORDER BY 1`, id, fromTime, toTime).Rows() + if err != nil { + return nil, err + } + } else if from != "" { + fromTime, err := time.Parse(time.RFC1123, from) + if err != nil { + return nil, err + } + rows, err = db.Raw( + `SELECT (published_at AT TIME ZONE 'Europe/Warsaw')::date, COUNT(*) + FROM tweets + WHERE object_id = ? AND published_at >= ? + GROUP BY 1 ORDER BY 1`, id, fromTime).Rows() + if err != nil { + return nil, err + } + } else if to != "" { + toTime, err := time.Parse(time.RFC1123, to) + if err != nil { + return nil, err + } + rows, err = db.Raw( + `SELECT (published_at AT TIME ZONE 'Europe/Warsaw')::date, COUNT(*) + FROM tweets + WHERE object_id = ? AND published_at <= ? + GROUP BY 1 ORDER BY 1`, id, toTime).Rows() + if err != nil { + return nil, err + } + } else { + rows, err = db.Raw( + `SELECT (published_at AT TIME ZONE 'Europe/Warsaw')::date, COUNT(*) + FROM tweets + WHERE object_id = ? + GROUP BY 1 ORDER BY 1`, id).Rows() + if err != nil { + return nil, err + } + } + + days := make([]DayStats, 0) + for rows.Next() { + var createdAt time.Time + var count int + err := rows.Scan(&createdAt, &count) + if err != nil { + return nil, err + } + days = append(days, DayStats{ + Date: createdAt.Format(time.RFC1123), + Count: count, + }) + } + + return &ObjectStats{ + ID: id, + Query: obj.Query, + Deleted: obj.DeletedAt != nil, + AllTweets: allCount, + Days: days, + }, nil +}