0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

プリザンターを使いこなしていく上で少し面倒になることが、サイトごとの設定を簡単に取り出す方法が無いことです。設定の実態は[Sites]テーブルの[SiteSettings]カラムにJSON型式で格納されているのですが扱うのがちょっと面倒・・・。
今回はこれらの設定のうち通知に関する設定を取り出す方法を紹介します。

取り出してみる

SQL Serverを使用している想定です。プリザンターの初期はSQL Serverのみのサポートだったので、おそらく使っているユーザが一番多いかなと。他のRDBMSを使用している場合は適時書き換えてください。
通知に関する設定は$.Notificationsに配列の形で格納されています。これをクエリを使って直接抜き出します。

SELECT
	*
FROM
	[Sites]
CROSS APPLY
	OPENJSON([SiteSettings], '$.Notifications')

こののJSONの中身は下記で定義されています。

ここから関係ある部分だけ抜き出します。実際のJSONにはNULLになっている項目(=使用されていない項目)は格納されません。

public int Id { get; set; } //ID
public Types Type; //メール・Chatworkなどのタイプ
public string Prefix; //タイトル前のプレフィックス
public string Subject; //タイトル
public string Address; //送信先アドレス(Chatworkなどの場合はURL)
public string CcAddress; //CC送信先アドレス
public string BccAddress; //BCC送信先アドレス
public string Token; //トークン(Chatworkなどの場合)
public MethodTypes? MethodType; //HttpClientのメソッド
public string Encoding; //エンコード
public string MediaType; //メディアタイプ
public string Headers; //ヘッダ
public bool? UseCustomFormat; //カスタムデザインの使用有無
public string Format; //フォーマット
public string Body; //HttpClientのボディ
public List<string> MonitorChangesColumns; //変更を検出するカラム
public int BeforeCondition; //変更前に使用するビューID(未設定の場合は0)
public int AfterCondition; //変更後に使用するビューID(未設定の場合は0)
public Expressions Expression; //変更前・変更後のAND or OR
public bool? AfterCreate; //実行条件「作成後」
public bool? AfterUpdate; //実行条件「更新後」
public bool? AfterDelete; //実行条件「削除後」
public bool? AfterCopy; //実行条件「コピー後」
public bool? AfterBulkUpdate; //実行条件「一括更新後」
public bool? AfterBulkDelete; //実行条件「一括削除後」
public bool? AfterImport; //実行条件「インポート後」
public bool? Disabled; //実行条件無効

TypesMethodTypesExpressionsは特定値が格納されています。

public enum Types : int
{
    Mail = 1,
    Slack = 2,
    ChatWork = 3,
    Line = 4,
    LineGroup = 5,
    Teams = 6,
    RocketChat = 7,
    InCircle = 8,
    HttpClient = 9
}
public enum Expressions : int
{
    Or = 1,
    And = 2
}
public enum MethodTypes : int
{
    Get = 1,
    Post = 2,
    Put = 3,
    Delete = 4
}

これらのコード側の定義をふまえて先ほどのクエリをブラッシュアップします。

SELECT
	[SiteId],
	[Title],
	JSON_VALUE(value, '$.Id') AS [Id],
	JSON_VALUE(value, '$.Type') AS [Type],
	JSON_VALUE(value, '$.Prefix') AS [Prefix],
	JSON_VALUE(value, '$.Subject') AS [Subject],
	JSON_VALUE(value, '$.Address') AS [Address],
	JSON_VALUE(value, '$.CcAddress') AS [CcAddress],
	JSON_VALUE(value, '$.BccAddress') AS [BccAddress],
	JSON_VALUE(value, '$.Token') AS [Token],
	JSON_VALUE(value, '$.MethodType') AS [MethodType],
	JSON_VALUE(value, '$.Encoding') AS [Encoding],
	JSON_VALUE(value, '$.MediaType') AS [MediaType],
	JSON_VALUE(value, '$.Headers') AS [Headers],
	JSON_VALUE(value, '$.UseCustomFormat') AS [UseCustomFormat],
	JSON_VALUE(value, '$.Format') AS [Format],
	JSON_VALUE(value, '$.Body') AS [Body],
	JSON_QUERY(value, '$.MonitorChangesColumns') AS [MonitorChangesColumns],
	JSON_VALUE(value, '$.BeforeCondition') AS [BeforeCondition],
	JSON_VALUE(value, '$.AfterCondition') AS [AfterCondition],
	JSON_VALUE(value, '$.Expression') AS [Expression],
	JSON_VALUE(value, '$.AfterCreate') AS [AfterCreate],
	JSON_VALUE(value, '$.AfterUpdate') AS [AfterUpdate],
	JSON_VALUE(value, '$.AfterDelete') AS [AfterDelete],
	JSON_VALUE(value, '$.AfterCopy') AS [AfterCopy],
	JSON_VALUE(value, '$.AfterBulkUpdate') AS [AfterBulkUpdate],
	JSON_VALUE(value, '$.AfterBulkDelete') AS [AfterBulkDelete],
	JSON_VALUE(value, '$.AfterImport') AS [AfterImport],
	JSON_VALUE(value, '$.Disabled') AS [Disabled]
FROM
	[Sites]
CROSS APPLY
	OPENJSON([SiteSettings], '$.Notifications')

これをWITH句などで使うといろいろと活用することが出来ます。

応用例

Chatworkに対して通知しているものの通知先のルームIDを取り出すクエリです。

WITH [Notifications] AS (
	SELECT
		[SiteId],
		[Title],
		JSON_VALUE(value, '$.Id') AS [Id],
		JSON_VALUE(value, '$.Type') AS [Type],
		JSON_VALUE(value, '$.Prefix') AS [Prefix],
		JSON_VALUE(value, '$.Subject') AS [Subject],
		JSON_VALUE(value, '$.Address') AS [Address],
		JSON_VALUE(value, '$.CcAddress') AS [CcAddress],
		JSON_VALUE(value, '$.BccAddress') AS [BccAddress],
		JSON_VALUE(value, '$.Token') AS [Token],
		JSON_VALUE(value, '$.MethodType') AS [MethodType],
		JSON_VALUE(value, '$.Encoding') AS [Encoding],
		JSON_VALUE(value, '$.MediaType') AS [MediaType],
		JSON_VALUE(value, '$.Headers') AS [Headers],
		JSON_VALUE(value, '$.UseCustomFormat') AS [UseCustomFormat],
		JSON_VALUE(value, '$.Format') AS [Format],
		JSON_VALUE(value, '$.Body') AS [Body],
		JSON_QUERY(value, '$.MonitorChangesColumns') AS [MonitorChangesColumns],
		JSON_VALUE(value, '$.BeforeCondition') AS [BeforeCondition],
		JSON_VALUE(value, '$.AfterCondition') AS [AfterCondition],
		JSON_VALUE(value, '$.Expression') AS [Expression],
		JSON_VALUE(value, '$.AfterCreate') AS [AfterCreate],
		JSON_VALUE(value, '$.AfterUpdate') AS [AfterUpdate],
		JSON_VALUE(value, '$.AfterDelete') AS [AfterDelete],
		JSON_VALUE(value, '$.AfterCopy') AS [AfterCopy],
		JSON_VALUE(value, '$.AfterBulkUpdate') AS [AfterBulkUpdate],
		JSON_VALUE(value, '$.AfterBulkDelete') AS [AfterBulkDelete],
		JSON_VALUE(value, '$.AfterImport') AS [AfterImport],
		JSON_VALUE(value, '$.Disabled') AS [Disabled]
	FROM
		[Sites]
	CROSS APPLY
		OPENJSON([SiteSettings], '$.Notifications')
)
SELECT
	[SiteId],
	[Title],
	[Id] AS [NotificationId],
	value AS [NotificationRoomId]
FROM
	[Notifications]
CROSS APPLY
	STRING_SPLIT ([Address], '/', 1)
WHERE
	[Type] IN (3)
	AND ordinal IN (6)

まとめ

今回は通知設定をハンドリングする方法を紹介しました。JSONで格納されているためキレイに扱おうとするとRDMBSの実装に依存するところがあるのがネックではあるのですが、扱えると権限や設定の棚卸しのハードルがかなり下がるので、是非試して見てください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?