Paste server written in Haskell. Fork of Hpaste, fully freedom and privacy respecting and generally improved. At the time of writing there's an instance at <http://paste.rel4tion.org>.

[[ 🗃 ^aoqmo toothpaste ]] :: [📥 Inbox] [📤 Outbox] [🐤 Followers] [🤝 Collaborators] [🛠 Commits]

Clone

HTTPS: git clone https://vervis.peers.community/repos/aoqmo

SSH: git clone USERNAME@vervis.peers.community:aoqmo

Branches

Tags

hpaste :: src / Hpaste / Model /

Report.hs

{-# OPTIONS -Wall -fno-warn-name-shadowing #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE ViewPatterns #-}

-- | Report model.

module Hpaste.Model.Report
 (getSomeReports,createReport,countReports)
  where

import           Hpaste.Types
import           Hpaste.Controller.Cache
import           Hpaste.Types.Cache as Key

import           Control.Monad

import           Control.Monad.Env
import           Control.Monad.IO
import           Data.Pagination
import           Data.Maybe
import           Data.Monoid.Operator ((++))
import qualified Data.Text as T
import qualified Data.Text.Lazy as LT
import           Network.Mail.Mime
import           Prelude              hiding ((++))
import           Snap.App

-- | Get some paginated reports.
getSomeReports :: Pagination -> Model c s [Report]
getSomeReports Pagination{..} =
  queryNoParams ["SELECT created,paste,comments"
                ,"FROM report"
                ,"ORDER BY id DESC"
                ,"OFFSET " ++ show (max 0 (pnCurrentPage - 1) * pnPerPage)
                ,"LIMIT " ++ show pnPerPage]

-- | Count reports.
countReports :: Model c s Integer
countReports = do
  rows <- singleNoParams ["SELECT COUNT(*)"
                         ,"FROM report"]
  return $ fromMaybe 0 rows

-- | Create a new report.
createReport :: ReportSubmit -> Model Config s (Maybe ReportId)
createReport rs@ReportSubmit{..} = do
  res <- single ["INSERT INTO report"
                ,"(paste,comments)"
                ,"VALUES"
                ,"(?,?)"
                ,"returning id"]
                (rsPaste,rsComments)
  _ <- exec ["UPDATE paste"
       	    ,"SET public = false"
	    ,"WHERE id = ?"]
	    (Only rsPaste)
  let reset pid = do
        resetCacheModel (Key.Paste pid)
        resetCacheModel (Key.Revision pid)
  reset rsPaste
  sendReport rs
  return res

sendReport :: ReportSubmit -> Model Config s ()
sendReport ReportSubmit{..} = do
  conf <- env modelStateConfig
  m <- io $ simpleMail (configAdmin conf)
		       (configSiteAddy conf)
		       (T.pack ("Paste reported: #" ++ show rsPaste))
		       (LT.pack body)
		       (LT.pack body)
		       []
  io $ renderSendMail m

  where body =
  	  "Paste " ++ show rsPaste ++ "\n\n" ++
	  "http://hpaste.org/" ++ show rsPaste ++ "?show_private=true" ++
	  "\n\n" ++
	  rsComments
[See repo JSON]