浏览代码

:sparkles: added membership plugin | membership service grabs memberships and list of groupings

master
TOJ 5 年前
父节点
当前提交
24cc194b23

+ 33
- 0
backend/lib/plugins/membership.js 查看文件

@@ -0,0 +1,33 @@
1
+const Objection = require('objection');
2
+const Schmervice = require('@hapipal/schmervice');
3
+
4
+const GroupingModel = require('../models/grouping');
5
+const MembershipModel = require('../models/membership');
6
+
7
+const MembershipService = require('../services/membership');
8
+
9
+const MembershipJoinRoute = require('../routes/membership/join');
10
+const MembershipLeaveRoute = require('../routes/membership/leave');
11
+const MembershipActiveRoute = require('../routes/membership/active');
12
+
13
+module.exports = {
14
+    name: 'membership-plugin',
15
+    version: '1.0.0',
16
+    register: async (server, options) => {
17
+        await server.registerModel(GroupingModel)
18
+        await server.registerModel(MembershipModel)
19
+
20
+        // Bind to global context
21
+        // So we can use Objection transactions
22
+        server.bind({
23
+            transaction: (fn) => Objection.transaction(server.knex(), fn)
24
+        })
25
+
26
+        await server.register(Schmervice)
27
+        server.registerService(MembershipService)
28
+
29
+        await server.route(MembershipJoinRoute)
30
+        await server.route(MembershipLeaveRoute)
31
+        await server.route(MembershipActiveRoute)
32
+    }
33
+}

+ 79
- 0
backend/lib/routes/membership/active.js 查看文件

@@ -0,0 +1,79 @@
1
+'use strict';
2
+
3
+const Joi = require('joi');
4
+
5
+const pluginConfig = {
6
+    handlerType: 'grouping',
7
+    docs: {
8
+        description: 'active memberships',
9
+        notes: 'A list of groupings with active membership'
10
+    }
11
+}
12
+
13
+const validators = {
14
+    /** Validate the header (cookie check) */
15
+    // headers: true,
16
+
17
+    /** Validate the route params (/active/{thing}) */
18
+    params: Joi.object({ user_id: Joi.number() }),
19
+
20
+    /** Validate the route query (/active/{thing}?limit=10&offset=10) */
21
+    // query: true,
22
+
23
+    /** Validate the incoming payload (POST method) */
24
+    // payload: true,
25
+}
26
+
27
+const responseSchemas = {
28
+    groupingsList: Joi.object({
29
+        grouping_id: Joi.number(),
30
+        grouping_name: Joi.string(),
31
+        grouping_type: Joi.string()
32
+    })
33
+}
34
+
35
+module.exports = {
36
+    method: 'GET',
37
+    path: '/active/{user_id}',
38
+    options: {
39
+        ...pluginConfig.docs,
40
+        tags: ['api'],
41
+        /** Protect this route with authentication? */
42
+        auth: false,
43
+
44
+        handler: async function (request, h) {
45
+            const { membershipService } = request.services()
46
+            const userId = request.params.user_id
47
+            const groupings = await membershipService.findGroupingsById(userId)
48
+            try {
49
+                return {
50
+                    ok: true,
51
+                    handler: pluginConfig.handlerType,
52
+                    data: groupings
53
+                }
54
+            }
55
+            catch(err) {
56
+                return {
57
+                    ok: false,
58
+                    handler: pluginConfig.handlerType,
59
+                    data: { error: `${err}` },
60
+                }
61
+            }
62
+        },
63
+
64
+        /** Validate based on validators object */
65
+        validate: {
66
+            ...validators,
67
+            failAction: 'log'
68
+         },
69
+
70
+        /** Validate the server response */
71
+        response: {
72
+            schema: Joi.object({
73
+                ok: Joi.bool(),
74
+                handler: Joi.string(),
75
+                data: Joi.array().items(responseSchemas.groupingsList),
76
+            })
77
+        }
78
+    }
79
+}

+ 52
- 0
backend/lib/routes/membership/join.js 查看文件

@@ -0,0 +1,52 @@
1
+'use strict';
2
+
3
+const Joi = require('joi');
4
+
5
+const pluginConfig = {
6
+    handlerType: 'grouping',
7
+    docs: {
8
+        description: 'join',
9
+        notes: 'Join a grouping by creating a membership record'
10
+    }
11
+}
12
+
13
+const validators = {
14
+    join: {
15
+        payload: Joi.object()
16
+    }
17
+}
18
+
19
+module.exports = {
20
+    method: 'POST',
21
+    path: '/join',
22
+    options: {
23
+        ...pluginConfig.docs,
24
+        tags: ['api'],
25
+        auth: false,
26
+        handler: async function (request, h) {
27
+            try {
28
+                return {
29
+                    ok: true,
30
+                    handler: pluginConfig.handlerType,
31
+                    data: { foo: 'bar' }
32
+                }
33
+            }
34
+            catch(err) {
35
+                return {
36
+                    ok: false,
37
+                    handler: pluginConfig.handlerType,
38
+                    data: { error: `${err}` },
39
+                }
40
+            }
41
+        },
42
+        validate: validators.join,
43
+        response: {
44
+            schema: Joi.object({
45
+                ok: Joi.bool(),
46
+                handler: Joi.string(),
47
+                data: validators.join
48
+            }),
49
+            failAction: 'log'
50
+        }
51
+    }
52
+}

+ 52
- 0
backend/lib/routes/membership/leave.js 查看文件

@@ -0,0 +1,52 @@
1
+'use strict';
2
+
3
+const Joi = require('joi');
4
+
5
+const pluginConfig = {
6
+    handlerType: 'grouping',
7
+    docs: {
8
+        description: 'leave',
9
+        notes: 'Leave a grouping by creating a membership record'
10
+    }
11
+}
12
+
13
+const validators = {
14
+    leave: {
15
+        payload: Joi.object()
16
+    }
17
+}
18
+
19
+module.exports = {
20
+    method: 'POST',
21
+    path: '/leave',
22
+    options: {
23
+        ...pluginConfig.docs,
24
+        tags: ['api'],
25
+        auth: false,
26
+        handler: async function (request, h) {
27
+            try {
28
+                return {
29
+                    ok: true,
30
+                    handler: pluginConfig.handlerType,
31
+                    data: { foo: 'bar' }
32
+                }
33
+            }
34
+            catch(err) {
35
+                return {
36
+                    ok: false,
37
+                    handler: pluginConfig.handlerType,
38
+                    data: { error: `${err}` },
39
+                }
40
+            }
41
+        },
42
+        validate: validators.leave,
43
+        response: {
44
+            schema: Joi.object({
45
+                ok: Joi.bool(),
46
+                handler: Joi.string(),
47
+                data: validators.leave
48
+            }),
49
+            failAction: 'log'
50
+        }
51
+    }
52
+}

+ 0
- 0
backend/lib/routes/response/respond.js 查看文件


+ 28
- 0
backend/lib/services/membership.js 查看文件

@@ -0,0 +1,28 @@
1
+'use strict';
2
+
3
+const Schmervice = require('@hapipal/schmervice');
4
+
5
+module.exports = class MembershipService extends Schmervice.Service {
6
+    constructor(...args) {
7
+        super(...args)
8
+    }
9
+    async findGroupingsById(id) {
10
+        const { Membership, Grouping } = this.server.models()
11
+
12
+        /** Grab every Membership associated with this id */
13
+        const allMemberships = await Membership.query()
14
+            .throwIfNotFound()
15
+            .where('user_id', id)
16
+
17
+        /** Copy a list of the just the Groupings */
18
+        const groupingIdsToGrab = allMemberships.map(membership => membership.grouping_id)
19
+
20
+        /** Uncomment to dedupe the list just in case */
21
+        const dedupedGroupings = [...new Set(groupingIdsToGrab)]
22
+
23
+        /** Grab just the Groupings this id has a Membership for */
24
+        return await Grouping.query()
25
+            .throwIfNotFound()
26
+            .whereIn('grouping_id', dedupedGroupings)
27
+    }
28
+}

正在加载...
取消
保存