Skip to content

Commit 94a3314

Browse files
authored
Merge pull request #405 from keillera/ALIS-4986
ALIS-4986: 書き込み制限処理を追加
2 parents db13083 + 21c165e commit 94a3314

File tree

14 files changed

+142
-8
lines changed

14 files changed

+142
-8
lines changed

src/common/db_util.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,19 @@ def validate_article_existence(cls, dynamodb, article_id, user_id=None, status=N
4242

4343
return True
4444

45+
@staticmethod
46+
def validate_write_blacklisted(dynamodb, user_id):
47+
screened_article_table = dynamodb.Table(os.environ['SCREENED_ARTICLE_TABLE_NAME'])
48+
write_blacklisted = screened_article_table.get_item(Key={'article_type': 'write_blacklisted'}).get('Item')
49+
50+
if not write_blacklisted or not write_blacklisted.get('users'):
51+
return True
52+
53+
if user_id in write_blacklisted.get('users'):
54+
raise ValidationError('Write restricted')
55+
56+
return True
57+
4558
@classmethod
4659
def validate_latest_price(cls, dynamodb, article_id, price):
4760
article_info_table = dynamodb.Table(os.environ['ARTICLE_INFO_TABLE_NAME'])

src/handlers/me/articles/comments/create/me_articles_comments_create.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ def validate_params(self):
3333
raise ValidationError('Request parameter is required')
3434

3535
validate(self.params, self.get_schema())
36+
DBUtil.validate_write_blacklisted(
37+
self.dynamodb,
38+
self.event['requestContext']['authorizer']['claims']['cognito:username']
39+
)
3640
DBUtil.validate_article_existence(self.dynamodb, self.params['article_id'], status='public')
3741

3842
def exec_main_proc(self):

src/handlers/me/articles/comments/reply/me_articles_comments_reply.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ def validate_params(self):
3939
raise ValidationError('Request parameter is required')
4040

4141
validate(self.params, self.get_schema())
42+
DBUtil.validate_write_blacklisted(
43+
self.dynamodb,
44+
self.event['requestContext']['authorizer']['claims']['cognito:username']
45+
)
4246
DBUtil.validate_article_existence(self.dynamodb, self.params['article_id'], status='public')
4347
DBUtil.validate_parent_comment_existence(self.dynamodb, self.params['parent_id'])
4448
DBUtil.validate_user_existence(self.dynamodb, self.params['replyed_user_id'])

src/handlers/me/articles/drafts/publish/me_articles_drafts_publish.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@ def validate_params(self):
3232
UserUtil.verified_phone_and_email(self.event)
3333
validate(self.params, self.get_schema())
3434

35+
DBUtil.validate_write_blacklisted(
36+
self.dynamodb,
37+
self.event['requestContext']['authorizer']['claims']['cognito:username']
38+
)
39+
3540
if self.params.get('tags'):
3641
ParameterUtil.validate_array_unique(self.params['tags'], 'tags', case_insensitive=True)
3742
TagUtil.validate_format(self.params['tags'])

src/handlers/me/articles/drafts/publish_with_header/me_articles_drafts_publish_with_header.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@ def validate_params(self):
4242

4343
validate(self.params, self.get_schema())
4444

45+
DBUtil.validate_write_blacklisted(
46+
self.dynamodb,
47+
self.event['requestContext']['authorizer']['claims']['cognito:username']
48+
)
49+
4550
if self.params.get('eye_catch_url'):
4651
TextSanitizer.validate_img_url(self.params.get('eye_catch_url'))
4752

src/handlers/me/articles/public/republish/me_articles_public_republish.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ def validate_params(self):
3333

3434
validate(self.params, self.get_schema())
3535

36+
DBUtil.validate_write_blacklisted(
37+
self.dynamodb,
38+
self.event['requestContext']['authorizer']['claims']['cognito:username']
39+
)
40+
3641
if self.params.get('tags'):
3742
ParameterUtil.validate_array_unique(self.params['tags'], 'tags', case_insensitive=True)
3843
TagUtil.validate_format(self.params['tags'])

src/handlers/me/articles/public/republish_with_header/me_articles_public_republish_with_header.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,11 @@ def validate_params(self):
4040

4141
validate(self.params, self.get_schema())
4242

43+
DBUtil.validate_write_blacklisted(
44+
self.dynamodb,
45+
self.event['requestContext']['authorizer']['claims']['cognito:username']
46+
)
47+
4348
if self.params.get('eye_catch_url'):
4449
TextSanitizer.validate_img_url(self.params.get('eye_catch_url'))
4550

tests/common/test_db_util.py

Lines changed: 57 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -255,8 +255,9 @@ def setUpClass(cls):
255255
TestsUtil.create_table(cls.dynamodb, os.environ['TOPIC_TABLE_NAME'], topic_items)
256256

257257
def setUp(self):
258-
# create article_content_edit_history_table
258+
# create tables
259259
TestsUtil.create_table(self.dynamodb, os.environ['ARTICLE_CONTENT_EDIT_HISTORY_TABLE_NAME'], [])
260+
TestsUtil.create_table(self.dynamodb, os.environ['SCREENED_ARTICLE_TABLE_NAME'], [])
260261
# backup settings
261262
self.tmp_put_interval = settings.ARTICLE_HISTORY_PUT_INTERVAL
262263

@@ -265,11 +266,16 @@ def tearDownClass(cls):
265266
TestsUtil.delete_all_tables(cls.dynamodb)
266267

267268
def tearDown(self):
268-
# delete article_content_edit_history_table
269-
del_table = self.dynamodb.Table(os.environ['ARTICLE_CONTENT_EDIT_HISTORY_TABLE_NAME'])
270-
del_table.delete()
271-
del_table.meta.client.get_waiter('table_not_exists').\
272-
wait(TableName=os.environ['ARTICLE_CONTENT_EDIT_HISTORY_TABLE_NAME'])
269+
# delete tables
270+
delete_tables = [
271+
'ARTICLE_CONTENT_EDIT_HISTORY_TABLE_NAME',
272+
'SCREENED_ARTICLE_TABLE_NAME'
273+
]
274+
for delete_table in delete_tables:
275+
del_table = self.dynamodb.Table(os.environ[delete_table])
276+
del_table.delete()
277+
del_table.meta.client.get_waiter('table_not_exists').\
278+
wait(TableName=os.environ[delete_table])
273279
# restore settings
274280
settings.ARTICLE_HISTORY_PUT_INTERVAL = self.tmp_put_interval
275281

@@ -442,6 +448,51 @@ def test_validate_article_existence_ng_not_exists_is_purchased(self):
442448
is_purchased=True
443449
)
444450

451+
def test_validate_write_blacklisted_ok_not_exists_write_blacklisted(self):
452+
result = DBUtil.validate_write_blacklisted(
453+
self.dynamodb,
454+
user_id=self.article_info_table_items[0]['user_id'],
455+
)
456+
self.assertTrue(result)
457+
458+
def test_validate_write_blacklisted_ok_not_exists_users_column(self):
459+
params = {
460+
'article_type': 'write_blacklisted'
461+
}
462+
screened_article_table = self.dynamodb.Table(os.environ['SCREENED_ARTICLE_TABLE_NAME'])
463+
screened_article_table.put_item(Item=params)
464+
result = DBUtil.validate_write_blacklisted(
465+
self.dynamodb,
466+
user_id=self.article_info_table_items[0]['user_id'],
467+
)
468+
self.assertTrue(result)
469+
470+
def test_validate_write_blacklisted_ok_not_exists_target_user(self):
471+
params = {
472+
'article_type': 'write_blacklisted',
473+
'users': ['testuser1', 'testuser2']
474+
}
475+
screened_article_table = self.dynamodb.Table(os.environ['SCREENED_ARTICLE_TABLE_NAME'])
476+
screened_article_table.put_item(Item=params)
477+
result = DBUtil.validate_write_blacklisted(
478+
self.dynamodb,
479+
user_id=self.article_info_table_items[0]['user_id'],
480+
)
481+
self.assertTrue(result)
482+
483+
def test_validate_article_existence_ng_exists_target_user(self):
484+
params = {
485+
'article_type': 'write_blacklisted',
486+
'users': ['testuser1', 'testuser2', self.article_info_table_items[0]['user_id']]
487+
}
488+
screened_article_table = self.dynamodb.Table(os.environ['SCREENED_ARTICLE_TABLE_NAME'])
489+
screened_article_table.put_item(Item=params)
490+
with self.assertRaises(ValidationError):
491+
DBUtil.validate_write_blacklisted(
492+
self.dynamodb,
493+
user_id=self.article_info_table_items[0]['user_id'],
494+
)
495+
445496
def test_validate_user_existence_ok(self):
446497
result = DBUtil.validate_user_existence(
447498
self.dynamodb,

tests/handlers/me/articles/comments/create/test_me_articles_comments_create.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ def setUp(self):
5252
self.unread_notification_manager_table = self.dynamodb.Table(os.environ['UNREAD_NOTIFICATION_MANAGER_TABLE_NAME'])
5353
TestsUtil.create_table(self.dynamodb, os.environ['UNREAD_NOTIFICATION_MANAGER_TABLE_NAME'], [])
5454

55+
TestsUtil.create_table(self.dynamodb, os.environ['SCREENED_ARTICLE_TABLE_NAME'], [])
56+
5557
def tearDown(self):
5658
TestsUtil.delete_all_tables(self.dynamodb)
5759

@@ -214,7 +216,7 @@ def test_main_ok_with_adding_comment_on_own_article(self):
214216
self.assertEqual(len(notification_after) - len(notification_before), 0)
215217
self.assertEqual(len(unread_notification_manager_after) - len(unread_notification_manager_before), 0)
216218

217-
def test_call_validate_comment_existence(self):
219+
def test_call_validate_methods(self):
218220
params = {
219221
'pathParameters': {
220222
'article_id': 'publicId0003'
@@ -245,6 +247,11 @@ def test_call_validate_comment_existence(self):
245247
self.assertTrue(args[1])
246248
self.assertEqual(kwargs['status'], 'public')
247249

250+
self.assertTrue(mock_lib.validate_write_blacklisted.called)
251+
args, kwargs = mock_lib.validate_write_blacklisted.call_args
252+
self.assertTrue(args[0])
253+
self.assertEqual(args[1], 'comment_user_01')
254+
248255
@patch('me_articles_comments_create.MeArticlesCommentsCreate._MeArticlesCommentsCreate__create_comment_notification',
249256
MagicMock(side_effect=Exception()))
250257
def test_raise_exception_in_creating_notification(self):

tests/handlers/me/articles/comments/reply/test_me_articles_comments_reply.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ def setUp(self):
101101
self.unread_notification_manager_table = self.dynamodb.Table(os.environ['UNREAD_NOTIFICATION_MANAGER_TABLE_NAME'])
102102
TestsUtil.create_table(self.dynamodb, os.environ['UNREAD_NOTIFICATION_MANAGER_TABLE_NAME'], [])
103103

104+
TestsUtil.create_table(self.dynamodb, os.environ['SCREENED_ARTICLE_TABLE_NAME'], [])
105+
104106
def tearDown(self):
105107
TestsUtil.delete_all_tables(self.dynamodb)
106108

@@ -435,7 +437,7 @@ def test___get_thread_notification_targets_ignore_value_errors(self):
435437
except ValueError:
436438
self.fail('get_thread_notification_tagets() raised ValueError unexpectedly')
437439

438-
def test_call_validate_comment_existence(self):
440+
def test_call_validate_methods(self):
439441
params = {
440442
'pathParameters': {
441443
'article_id': 'publicId0001'
@@ -468,6 +470,11 @@ def test_call_validate_comment_existence(self):
468470
self.assertEqual(args[1], 'publicId0001')
469471
self.assertEqual(kwargs['status'], 'public')
470472

473+
self.assertTrue(mock_lib.validate_write_blacklisted.called)
474+
args, kwargs = mock_lib.validate_write_blacklisted.call_args
475+
self.assertTrue(args[0])
476+
self.assertEqual(args[1], 'comment_user_01')
477+
471478
args, _ = mock_lib.validate_parent_comment_existence.call_args
472479
self.assertTrue(mock_lib.validate_parent_comment_existence.called)
473480
self.assertEqual(args[0], self.dynamodb)

0 commit comments

Comments
 (0)