All Downloads are FREE. Search and download functionalities are using the official Maven repository.

gitbucket.core.service.ActivityService.scala Maven / Gradle / Ivy

The newest version!
package gitbucket.core.service

import gitbucket.core.model.Activity
import gitbucket.core.util.Directory._
import org.json4s._
import org.json4s.jackson.Serialization
import org.json4s.jackson.Serialization.{read, write}

import scala.util.Using
import java.io.FileOutputStream
import java.nio.charset.StandardCharsets
import gitbucket.core.controller.Context
import gitbucket.core.util.ConfigUtil
import org.apache.commons.io.input.ReversedLinesFileReader
import ActivityService._

import scala.collection.mutable.ListBuffer

trait ActivityService {
  self: RequestCache =>

  private implicit val formats: Formats = Serialization.formats(NoTypeHints)

  private def writeLog(activity: Activity): Unit = {
    Using.resource(new FileOutputStream(ActivityLog, true)) { out =>
      out.write((write(activity) + "\n").getBytes(StandardCharsets.UTF_8))
    }
  }

  def getActivitiesByUser(activityUserName: String, publicOnly: Boolean)(implicit context: Context): List[Activity] = {
    getActivities(includePublic = false) { activity =>
      if (activity.activityUserName == activityUserName) {
        !publicOnly || isPublicActivity(activity)
      } else false
    }
  }

  def getRecentPublicActivities()(implicit context: Context): List[Activity] = {
    getActivities(includePublic = true) { _ =>
      false
    }
  }

  def getRecentActivitiesByRepos(repos: Set[(String, String)])(implicit context: Context): List[Activity] = {
    getActivities(includePublic = true) { activity =>
      repos.exists { case (userName, repositoryName) =>
        activity.userName == userName && activity.repositoryName == repositoryName
      }
    }
  }

  private def getActivities(
    includePublic: Boolean
  )(filter: Activity => Boolean)(implicit context: Context): List[Activity] = {
    if (!isNewsFeedEnabled || !ActivityLog.exists()) {
      List.empty
    } else {
      val list = new ListBuffer[Activity]
      Using.resource(
        ReversedLinesFileReader
          .builder()
          .setFile(ActivityLog)
          .setCharset(StandardCharsets.UTF_8)
          .get()
      ) { reader =>
        var json: String = null
        while (
          list.length < 50 && {
            json = reader.readLine();
            json
          } != null
        ) {
          val activity = read[Activity](json)
          if (filter(activity)) {
            list += activity
          } else if (includePublic && isPublicActivity(activity)) {
            list += activity
          }
        }
      }
      list.toList
    }
  }

  private def isPublicActivity(activity: Activity)(implicit context: Context): Boolean = {
    !getRepositoryInfoFromCache(activity.userName, activity.repositoryName).forall(_.isPrivate)
  }

  def recordActivity[T <: { def toActivity: Activity }](info: T): Unit = {
    import scala.language.reflectiveCalls
    writeLog(info.toActivity)
  }
}

object ActivityService {
  def isNewsFeedEnabled: Boolean =
    !ConfigUtil.getConfigValue[Boolean]("gitbucket.disableNewsFeed").getOrElse(false)
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy