Skip to content

Commit 3568722

Browse files
committed
Add external link tracking
1 parent 63c31f5 commit 3568722

File tree

15 files changed

+244
-0
lines changed

15 files changed

+244
-0
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
module WizardLib.Public.Database.DAO.ExternalLink.ExternalLinkUsageDAO where
2+
3+
import GHC.Int
4+
5+
import Shared.Common.Database.DAO.Common
6+
import Shared.Common.Model.Context.AppContext
7+
import WizardLib.Public.Database.Mapping.ExternalLink.ExternalLinkUsage ()
8+
import WizardLib.Public.Model.ExternalLink.ExternalLinkUsage
9+
10+
entityName = "external_link_usage"
11+
12+
findExternalLinkUsages :: AppContextC s sc m => m [ExternalLinkUsage]
13+
findExternalLinkUsages = createFindEntitiesFn entityName
14+
15+
insertExternalLinkUsage :: AppContextC s sc m => ExternalLinkUsage -> m Int64
16+
insertExternalLinkUsage = createInsertFn entityName
17+
18+
deleteExternalLinkUsages :: AppContextC s sc m => m Int64
19+
deleteExternalLinkUsages = createDeleteEntitiesFn entityName
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
module WizardLib.Public.Database.Mapping.ExternalLink.ExternalLinkUsage where
2+
3+
import Database.PostgreSQL.Simple
4+
5+
import WizardLib.Public.Model.ExternalLink.ExternalLinkUsage
6+
7+
instance ToRow ExternalLinkUsage
8+
9+
instance FromRow ExternalLinkUsage
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
module WizardLib.Public.Database.Migration.Development.ExternalLink.ExternalLinkMigration where
2+
3+
import Shared.Common.Constant.Component
4+
import Shared.Common.Model.Context.AppContext
5+
import Shared.Common.Util.Logger
6+
import WizardLib.Public.Database.DAO.ExternalLink.ExternalLinkUsageDAO
7+
8+
runMigration :: AppContextC s sc m => m ()
9+
runMigration = do
10+
logInfo _CMP_MIGRATION "(ExternalLink/ExternalLink) started"
11+
deleteExternalLinkUsages
12+
logInfo _CMP_MIGRATION "(ExternalLink/ExternalLink) ended"
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
module WizardLib.Public.Database.Migration.Development.ExternalLink.ExternalLinkSchemaMigration where
2+
3+
import Database.PostgreSQL.Simple
4+
import GHC.Int
5+
6+
import Shared.Common.Database.DAO.Common
7+
import Shared.Common.Model.Context.AppContext
8+
import Shared.Common.Util.Logger
9+
10+
dropTables :: AppContextC s sc m => m Int64
11+
dropTables = do
12+
logInfo _CMP_MIGRATION "(Table/ExternalLink) drop tables"
13+
let sql = "DROP TABLE IF EXISTS external_link_usage CASCADE;"
14+
let action conn = execute_ conn sql
15+
runDB action
16+
17+
createTables :: AppContextC s sc m => m Int64
18+
createTables = do
19+
logInfo _CMP_MIGRATION "(Table/ExternalLink) create table"
20+
let sql =
21+
"CREATE TABLE external_link_usage \
22+
\( \
23+
\ uuid uuid NOT NULL, \
24+
\ url varchar NOT NULL, \
25+
\ tenant_uuid uuid NOT NULL, \
26+
\ created_at timestamptz NOT NULL, \
27+
\ CONSTRAINT external_link_usage_pk PRIMARY KEY (uuid, tenant_uuid), \
28+
\ CONSTRAINT external_link_usage_tenant_uuid_fk FOREIGN KEY (tenant_uuid) REFERENCES tenant (uuid) \
29+
\);"
30+
let action conn = execute_ conn sql
31+
runDB action
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
module WizardLib.Public.Model.ExternalLink.ExternalLinkUsage where
2+
3+
import Data.Time
4+
import qualified Data.UUID as U
5+
import GHC.Generics
6+
7+
data ExternalLinkUsage = ExternalLinkUsage
8+
{ uuid :: U.UUID
9+
, url :: String
10+
, tenantUuid :: U.UUID
11+
, createdAt :: UTCTime
12+
}
13+
deriving (Show, Eq, Generic)
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
module WizardLib.Public.Service.ExternalLink.ExternalLinkUsageService where
2+
3+
import Control.Monad (void)
4+
import Control.Monad.Reader (asks, liftIO)
5+
import Data.Time
6+
import Prelude hiding (id)
7+
8+
import Shared.Common.Database.DAO.Common
9+
import Shared.Common.Model.Context.AppContext
10+
import Shared.Common.Util.Logger
11+
import Shared.Common.Util.Uuid
12+
import WizardLib.Public.Database.DAO.ExternalLink.ExternalLinkUsageDAO
13+
import WizardLib.Public.Model.ExternalLink.ExternalLinkUsage
14+
15+
createExternalLinkUsage :: AppContextC s sc m => String -> m ()
16+
createExternalLinkUsage url =
17+
runInTransaction logInfoI logWarnI $ do
18+
uuid <- liftIO generateUuid
19+
tenantUuid <- asks (.tenantUuid')
20+
now <- liftIO getCurrentTime
21+
let externalLinkUsage = ExternalLinkUsage uuid url tenantUuid now
22+
void $ insertExternalLinkUsage externalLinkUsage

wizard-server/src/Wizard/Api/Handler/Api.hs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import Wizard.Api.Handler.DocumentTemplateDraft.Asset.Api
1717
import Wizard.Api.Handler.DocumentTemplateDraft.File.Api
1818
import Wizard.Api.Handler.DocumentTemplateDraft.Folder.Api
1919
import Wizard.Api.Handler.Domain.Api
20+
import Wizard.Api.Handler.ExternalLink.Api
2021
import Wizard.Api.Handler.Feedback.Api
2122
import Wizard.Api.Handler.Info.Api
2223
import Wizard.Api.Handler.KnowledgeModel.Api
@@ -56,6 +57,7 @@ type ApplicationAPI =
5657
:<|> DocumentTemplateFileAPI
5758
:<|> DocumentAPI
5859
:<|> DomainAPI
60+
:<|> ExternalLinkAPI
5961
:<|> FeedbackAPI
6062
:<|> InfoAPI
6163
:<|> KnowledgeModelAPI
@@ -98,6 +100,7 @@ applicationServer =
98100
:<|> documentTemplateFileServer
99101
:<|> documentServer
100102
:<|> domainServer
103+
:<|> externalLinkServer
101104
:<|> feedbackServer
102105
:<|> infoServer
103106
:<|> knowledgeModelServer
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
module Wizard.Api.Handler.ExternalLink.Api where
2+
3+
import Servant
4+
import Servant.Swagger.Tags
5+
6+
import Wizard.Api.Handler.ExternalLink.List_GET
7+
import Wizard.Model.Context.BaseContext
8+
9+
type ExternalLinkAPI =
10+
Tags "ExternalLink"
11+
:> List_GET
12+
13+
externalLinkApi :: Proxy ExternalLinkAPI
14+
externalLinkApi = Proxy
15+
16+
externalLinkServer :: ServerT ExternalLinkAPI BaseContextM
17+
externalLinkServer = list_GET
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
module Wizard.Api.Handler.ExternalLink.List_GET where
2+
3+
import Servant
4+
5+
import Shared.Common.Api.Handler.Common
6+
import Shared.Common.Model.Context.TransactionState
7+
import Shared.Common.Model.Error.Error
8+
import Wizard.Api.Handler.Common
9+
import Wizard.Model.Context.BaseContext
10+
import WizardLib.Public.Service.ExternalLink.ExternalLinkUsageService
11+
12+
type List_GET =
13+
Header "Host" String
14+
:> "external-link"
15+
:> QueryParam' '[Required] "url" String
16+
:> Get '[SafeJSON] (Headers '[Header "x-trace-uuid" String] NoContent)
17+
18+
list_GET :: Maybe String -> String -> BaseContextM (Headers '[Header "x-trace-uuid" String] NoContent)
19+
list_GET mServerUrl url =
20+
runInUnauthService mServerUrl Transactional $
21+
addTraceUuidHeader =<< do
22+
createExternalLinkUsage url
23+
throwError $ FoundError url

wizard-server/src/Wizard/Database/Migration/Development/Migration.hs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ import qualified Wizard.Database.Migration.Development.Tenant.TenantSchemaMigrat
4646
import qualified Wizard.Database.Migration.Development.User.UserMigration as User
4747
import qualified Wizard.Database.Migration.Development.User.UserSchemaMigration as User
4848
import Wizard.Model.Context.ContextMappers
49+
import qualified WizardLib.Public.Database.Migration.Development.ExternalLink.ExternalLinkMigration as ExternalLink
50+
import qualified WizardLib.Public.Database.Migration.Development.ExternalLink.ExternalLinkSchemaMigration as ExternalLink
4951

5052
runMigration = runAppContextWithBaseContext $ do
5153
logInfo _CMP_MIGRATION "started"
@@ -54,6 +56,7 @@ runMigration = runAppContextWithBaseContext $ do
5456
Package.dropFunctions
5557
Common.dropFunctions
5658
-- 2. Drop schema
59+
ExternalLink.dropTables
5760
KnowledgeModel.dropTables
5861
Component.dropTables
5962
TemporaryFile.dropTables
@@ -100,6 +103,7 @@ runMigration = runAppContextWithBaseContext $ do
100103
TemporaryFile.createTables
101104
Component.createTables
102105
KnowledgeModel.createTables
106+
ExternalLink.createTables
103107
-- 4. Create DB functions
104108
Common.createFunctions
105109
Package.createFunctions
@@ -126,5 +130,6 @@ runMigration = runAppContextWithBaseContext $ do
126130
Registry.runMigration
127131
Locale.runMigration
128132
Component.runMigration
133+
ExternalLink.runMigration
129134
logInfo _CMP_MIGRATION "ended"
130135
return Nothing

0 commit comments

Comments
 (0)