Skip to content

Commit 102fe84

Browse files
authored
fix(condo): DOMA-11144 renamed MeterUserData to MeterUserSetting (#5870)
* fix(condo): DOMA-11144 fixed access, tests and deleted unnecessary client schema * refactor(condo): DOMA-11144 made schema names more obvious and intuitive * refactor(condo): DOMA-11144 renamed model MeterUserData to MeterUserSetting * fix(condo): DOMA-11144 pr fixes * fix(condo): DOMA-11144 fixed typos
1 parent 0bdcb9a commit 102fe84

13 files changed

+460
-432
lines changed

apps/condo/domains/meter/access/MeterUserData.js

-63
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
/**
2+
* Generated by `createschema meter.MeterUserSetting 'user:Relationship:User:CASCADE; meter:Relationship:Meter:CASCADE; name:Text'`
3+
*/
4+
5+
const get = require('lodash/get')
6+
7+
const { throwAuthenticationError } = require('@open-condo/keystone/apolloErrorFormatter')
8+
const { find } = require('@open-condo/keystone/schema')
9+
10+
const { getAvailableResidentMeters } = require('@condo/domains/meter/utils/serverSchema')
11+
const { RESIDENT } = require('@condo/domains/user/constants/common')
12+
13+
async function canReadMeterUserSetting ({ authentication: { item: user } }) {
14+
if (!user) return throwAuthenticationError()
15+
if (user.deletedAt) return false
16+
if (user.isAdmin || user.isSupport) return {}
17+
18+
if (user.type === RESIDENT) {
19+
return {
20+
user: { id: user.id },
21+
}
22+
}
23+
24+
return false
25+
}
26+
27+
28+
async function canManageMeterUserSetting ({ authentication: { item: user }, originalInput, operation, itemId, itemIds }) {
29+
if (!user) return throwAuthenticationError()
30+
if (user.deletedAt) return false
31+
if (user.isAdmin || user.isSupport) return true
32+
33+
if (user.type === RESIDENT) {
34+
if (operation === 'update') {
35+
const ids = itemIds || [itemId]
36+
if (ids.length !== new Set(ids).size) return false
37+
38+
const items = await find('MeterUserSetting', {
39+
id_in: ids,
40+
deletedAt: null,
41+
})
42+
if (items.length !== ids.length || items.some(item => !item.user)) return false
43+
44+
return items.every(item => item.user === user.id)
45+
}
46+
47+
if (operation === 'create') {
48+
const inputs = Array.isArray(originalInput) ? originalInput : [originalInput]
49+
const otherUserIds = inputs.map(inp => get(inp, ['user', 'connect', 'id'])).filter(id => id !== user.id)
50+
if (otherUserIds.length) return false
51+
52+
const inputMeterIds = inputs.map(inp => get(inp, ['meter', 'connect', 'id']))
53+
// restrict meter: { create: {} } case
54+
if (!inputMeterIds.every(Boolean)) return false
55+
56+
const availableMeters = await getAvailableResidentMeters(user.id)
57+
const availableMetersIds = new Set(availableMeters.map((meter) => meter.id))
58+
59+
return inputMeterIds.every(id => availableMetersIds.has(id))
60+
}
61+
}
62+
63+
return false
64+
}
65+
66+
67+
68+
/*
69+
Rules are logical functions that used for list access, and may return a boolean (meaning
70+
all or no items are available) or a set of filters that limit the available items.
71+
*/
72+
module.exports = {
73+
canManageMeterUserSetting,
74+
canReadMeterUserSetting,
75+
}

apps/condo/domains/meter/gql.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,8 @@ const MeterReadingsImportTask = generateGqlQueries('MeterReadingsImportTask', ME
8989
const METER_READING_EXPORT_TASK_FIELDS = `{ status format exportedRecordsCount totalRecordsCount file { id originalFilename publicUrl mimetype } meta where sortBy locale timeZone user { id } ${COMMON_FIELDS} }`
9090
const MeterReadingExportTask = generateGqlQueries('MeterReadingExportTask', METER_READING_EXPORT_TASK_FIELDS)
9191

92-
const METER_USER_DATA_FIELDS = `{ user { id } meter { id } name ${COMMON_FIELDS} }`
93-
const MeterUserData = generateGqlQueries('MeterUserData', METER_USER_DATA_FIELDS)
92+
const METER_USER_SETTING_FIELDS = `{ user { id } meter { id } name ${COMMON_FIELDS} }`
93+
const MeterUserSetting = generateGqlQueries('MeterUserSetting', METER_USER_SETTING_FIELDS)
9494

9595
/* AUTOGENERATE MARKER <CONST> */
9696

@@ -113,7 +113,7 @@ module.exports = {
113113
REGISTER_PROPERTY_METERS_READINGS_MUTATION,
114114
MeterReadingsImportTask,
115115
MeterReadingExportTask,
116-
MeterUserData,
116+
MeterUserSetting,
117117
/* AUTOGENERATE MARKER <EXPORTS> */
118118
}
119119

apps/condo/domains/meter/schema/MeterUserData.js apps/condo/domains/meter/schema/MeterUserSetting.js

+11-12
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,20 @@
11
/**
2-
* Generated by `createschema meter.MeterUserData 'user:Relationship:User:CASCADE; meter:Relationship:Meter:CASCADE; name:Text'`
2+
* Generated by `createschema meter.MeterUserSetting 'user:Relationship:User:CASCADE; meter:Relationship:Meter:CASCADE; name:Text'`
33
*/
44

55
const { historical, versioned, uuided, tracked, softDeleted, dvAndSender } = require('@open-condo/keystone/plugins')
66
const { GQLListSchema } = require('@open-condo/keystone/schema')
77

8-
const access = require('@condo/domains/meter/access/MeterUserData')
8+
const access = require('@condo/domains/meter/access/MeterUserSetting')
99
const { RESIDENT } = require('@condo/domains/user/constants/common')
1010

1111

12-
const MeterUserData = new GQLListSchema('MeterUserData', {
13-
schemaDoc: `Custom user data that a user with type ${RESIDENT} can assign to a specific meter device to make it easier to understand what kind of device it is`,
14-
plural: 'MeterUserData',
12+
const MeterUserSetting = new GQLListSchema('MeterUserSetting', {
13+
schemaDoc: `Custom user setting that a user with type ${RESIDENT} can assign to a specific meter device to make it easier to understand what kind of device it is`,
1514
fields: {
1615

1716
user: {
18-
schemaDoc: 'User that created their custom meter data',
17+
schemaDoc: 'User that created their custom meter setting',
1918
type: 'Relationship',
2019
ref: 'User',
2120
isRequired: true,
@@ -24,7 +23,7 @@ const MeterUserData = new GQLListSchema('MeterUserData', {
2423
},
2524

2625
meter: {
27-
schemaDoc: 'Meter for which the user created custom data',
26+
schemaDoc: 'Meter for which the user created custom setting',
2827
type: 'Relationship',
2928
ref: 'Meter',
3029
isRequired: true,
@@ -45,20 +44,20 @@ const MeterUserData = new GQLListSchema('MeterUserData', {
4544
type: 'models.UniqueConstraint',
4645
fields: ['user', 'meter'],
4746
condition: 'Q(deletedAt__isnull=True)',
48-
name: 'Meter_user_data_unique_user_meter',
47+
name: 'Meter_user_setting_unique_user_meter',
4948
},
5049
],
5150
},
5251
plugins: [uuided(), versioned(), tracked(), softDeleted(), dvAndSender(), historical()],
5352
access: {
54-
read: access.canReadMeterUserData,
55-
create: access.canManageMeterUserData,
56-
update: access.canManageMeterUserData,
53+
read: access.canReadMeterUserSetting,
54+
create: access.canManageMeterUserSetting,
55+
update: access.canManageMeterUserSetting,
5756
delete: false,
5857
auth: true,
5958
},
6059
})
6160

6261
module.exports = {
63-
MeterUserData,
62+
MeterUserSetting,
6463
}

0 commit comments

Comments
 (0)