@next-k8s/tickets 1.0.23 → 1.0.26

Sign up to get free protection for your applications and to get access to all the features.
Files changed (29) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/coverage/clover.xml +17 -141
  3. package/coverage/coverage-final.json +1 -10
  4. package/coverage/lcov-report/index.html +19 -79
  5. package/coverage/lcov-report/src/app.ts.html +1 -1
  6. package/coverage/lcov-report/src/events/publishers/created.ts.html +106 -0
  7. package/coverage/lcov-report/src/events/publishers/index.html +131 -0
  8. package/coverage/lcov-report/src/events/publishers/updated.ts.html +106 -0
  9. package/coverage/lcov-report/src/index.html +1 -1
  10. package/coverage/lcov-report/src/models/index.html +5 -5
  11. package/coverage/lcov-report/src/models/ticket.ts.html +19 -10
  12. package/coverage/lcov-report/src/routes/create.ts.html +2 -2
  13. package/coverage/lcov-report/src/routes/find.ts.html +1 -1
  14. package/coverage/lcov-report/src/routes/get.ts.html +1 -1
  15. package/coverage/lcov-report/src/routes/index.html +1 -1
  16. package/coverage/lcov-report/src/routes/index.ts.html +1 -1
  17. package/coverage/lcov-report/src/routes/update.ts.html +3 -6
  18. package/coverage/lcov-report/src/test/index.html +1 -1
  19. package/coverage/lcov-report/src/test/utils.ts.html +1 -1
  20. package/coverage/lcov-report/ticket.ts.html +220 -0
  21. package/coverage/lcov.info +16 -215
  22. package/package.json +4 -3
  23. package/pnpm-lock.yaml +27 -4
  24. package/src/events/publishers/{tickets/created.ts → created.ts} +0 -0
  25. package/src/events/publishers/{tickets/updated.ts → updated.ts} +0 -0
  26. package/src/models/__test__/ticket.test.ts +37 -0
  27. package/src/models/ticket.ts +4 -1
  28. package/src/routes/create.ts +1 -1
  29. package/src/routes/update.ts +1 -2
@@ -0,0 +1,220 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for ticket.ts</title>
7
+ <meta charset="utf-8" />
8
+ <link rel="stylesheet" href="prettify.css" />
9
+ <link rel="stylesheet" href="base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="favicon.png" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <style type='text/css'>
13
+ .coverage-summary .sorter {
14
+ background-image: url(sort-arrow-sprite.png);
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <div class='wrapper'>
21
+ <div class='pad1'>
22
+ <h1><a href="index.html">All files</a> ticket.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">72.72% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>8/11</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">100% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>0/0</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">50% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>1/2</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">72.72% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>8/11</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input oninput="onInput()" type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line medium'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a>
108
+ <a name='L43'></a><a href='#L43'>43</a>
109
+ <a name='L44'></a><a href='#L44'>44</a>
110
+ <a name='L45'></a><a href='#L45'>45</a>
111
+ <a name='L46'></a><a href='#L46'>46</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
112
+ <span class="cline-any cline-yes">1x</span>
113
+ <span class="cline-any cline-neutral">&nbsp;</span>
114
+ <span class="cline-any cline-neutral">&nbsp;</span>
115
+ <span class="cline-any cline-neutral">&nbsp;</span>
116
+ <span class="cline-any cline-neutral">&nbsp;</span>
117
+ <span class="cline-any cline-neutral">&nbsp;</span>
118
+ <span class="cline-any cline-neutral">&nbsp;</span>
119
+ <span class="cline-any cline-neutral">&nbsp;</span>
120
+ <span class="cline-any cline-neutral">&nbsp;</span>
121
+ <span class="cline-any cline-neutral">&nbsp;</span>
122
+ <span class="cline-any cline-yes">1x</span>
123
+ <span class="cline-any cline-neutral">&nbsp;</span>
124
+ <span class="cline-any cline-neutral">&nbsp;</span>
125
+ <span class="cline-any cline-neutral">&nbsp;</span>
126
+ <span class="cline-any cline-neutral">&nbsp;</span>
127
+ <span class="cline-any cline-neutral">&nbsp;</span>
128
+ <span class="cline-any cline-neutral">&nbsp;</span>
129
+ <span class="cline-any cline-neutral">&nbsp;</span>
130
+ <span class="cline-any cline-neutral">&nbsp;</span>
131
+ <span class="cline-any cline-neutral">&nbsp;</span>
132
+ <span class="cline-any cline-neutral">&nbsp;</span>
133
+ <span class="cline-any cline-neutral">&nbsp;</span>
134
+ <span class="cline-any cline-neutral">&nbsp;</span>
135
+ <span class="cline-any cline-neutral">&nbsp;</span>
136
+ <span class="cline-any cline-neutral">&nbsp;</span>
137
+ <span class="cline-any cline-neutral">&nbsp;</span>
138
+ <span class="cline-any cline-neutral">&nbsp;</span>
139
+ <span class="cline-any cline-neutral">&nbsp;</span>
140
+ <span class="cline-any cline-no">&nbsp;</span>
141
+ <span class="cline-any cline-no">&nbsp;</span>
142
+ <span class="cline-any cline-no">&nbsp;</span>
143
+ <span class="cline-any cline-neutral">&nbsp;</span>
144
+ <span class="cline-any cline-neutral">&nbsp;</span>
145
+ <span class="cline-any cline-neutral">&nbsp;</span>
146
+ <span class="cline-any cline-neutral">&nbsp;</span>
147
+ <span class="cline-any cline-yes">1x</span>
148
+ <span class="cline-any cline-yes">1x</span>
149
+ <span class="cline-any cline-neutral">&nbsp;</span>
150
+ <span class="cline-any cline-yes">1x</span>
151
+ <span class="cline-any cline-yes">1x</span>
152
+ <span class="cline-any cline-neutral">&nbsp;</span>
153
+ <span class="cline-any cline-yes">4x</span>
154
+ <span class="cline-any cline-neutral">&nbsp;</span>
155
+ <span class="cline-any cline-neutral">&nbsp;</span>
156
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import mongoose, { ObjectId } from 'mongoose'
157
+ import { updateIfCurrentPlugin } from 'mongoose-update-if-current'
158
+ &nbsp;
159
+ interface TicketAttributes {
160
+ title: String;
161
+ price: Number;
162
+ owner: string;
163
+ createdAt?: Date;
164
+ updatedAt?: Date;
165
+ }
166
+ &nbsp;
167
+ const ticketSchema = new mongoose.Schema({
168
+ title: {
169
+ type: String,
170
+ required: true
171
+ },
172
+ &nbsp;
173
+ price: {
174
+ type: Number,
175
+ required: true
176
+ },
177
+ &nbsp;
178
+ owner: {
179
+ type: mongoose.Schema.Types.ObjectId,
180
+ required: true
181
+ }
182
+ }, {
183
+ toJSON: {
184
+ <span class="fstat-no" title="function not covered" > transform </span>(doc, ret) {
185
+ <span class="cstat-no" title="statement not covered" > ret.id = ret._id</span>
186
+ <span class="cstat-no" title="statement not covered" > delete ret._id</span>
187
+ <span class="cstat-no" title="statement not covered" > delete ret.password</span>
188
+ }
189
+ }
190
+ })
191
+ &nbsp;
192
+ ticketSchema.set('versionKey', 'version')
193
+ ticketSchema.plugin(updateIfCurrentPlugin)
194
+ &nbsp;
195
+ export const TicketModel = mongoose.model('Ticket', ticketSchema)
196
+ export default class Ticket extends TicketModel {
197
+ constructor(attributes: TicketAttributes) {
198
+ super(attributes)
199
+ }
200
+ }
201
+ &nbsp;</pre></td></tr></table></pre>
202
+
203
+ <div class='push'></div><!-- for sticky footer -->
204
+ </div><!-- /wrapper -->
205
+ <div class='footer quiet pad2 space-top1 center small'>
206
+ Code coverage generated by
207
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
208
+ at Tue Jul 12 2022 13:03:37 GMT-0500 (Central Daylight Time)
209
+ </div>
210
+ <script src="prettify.js"></script>
211
+ <script>
212
+ window.onload = function () {
213
+ prettyPrint();
214
+ };
215
+ </script>
216
+ <script src="sorter.js"></script>
217
+ <script src="block-navigation.js"></script>
218
+ </body>
219
+ </html>
220
+
@@ -1,223 +1,24 @@
1
1
  TN:
2
- SF:src/app.ts
3
- FN:18,(anonymous_8)
4
- FN:18,(anonymous_9)
5
- FNF:2
6
- FNH:0
7
- FNDA:0,(anonymous_8)
8
- FNDA:0,(anonymous_9)
9
- DA:1,4
10
- DA:2,4
11
- DA:3,4
12
- DA:4,4
13
- DA:6,4
14
- DA:7,4
15
- DA:9,4
16
- DA:11,4
17
- DA:12,4
18
- DA:13,4
19
- DA:14,4
20
- DA:16,4
21
- DA:17,16
22
- DA:18,4
23
- DA:19,4
24
- DA:21,4
25
- LF:16
26
- LH:16
27
- BRF:0
28
- BRH:0
29
- end_of_record
30
- TN:
31
- SF:src/events/publishers/tickets/created.ts
32
- FN:3,(anonymous_0)
33
- FNF:1
34
- FNH:1
35
- FNDA:10,(anonymous_0)
36
- DA:1,4
37
- DA:3,4
38
- DA:4,10
39
- DA:7,4
40
- LF:4
41
- LH:4
42
- BRF:0
43
- BRH:0
44
- end_of_record
45
- TN:
46
- SF:src/events/publishers/tickets/updated.ts
47
- FN:3,(anonymous_0)
48
- FNF:1
49
- FNH:1
50
- FNDA:1,(anonymous_0)
51
- DA:1,4
52
- DA:3,4
53
- DA:4,1
54
- DA:7,4
55
- LF:4
56
- LH:4
57
- BRF:0
58
- BRH:0
59
- end_of_record
60
- TN:
61
2
  SF:src/models/ticket.ts
62
3
  FN:29,(anonymous_1)
63
- FN:39,(anonymous_2)
64
- FNF:2
65
- FNH:2
66
- FNDA:15,(anonymous_1)
67
- FNDA:17,(anonymous_2)
68
- DA:1,4
69
- DA:11,4
70
- DA:30,15
71
- DA:31,15
72
- DA:32,15
73
- DA:37,4
74
- DA:38,4
75
- DA:40,17
76
- LF:8
77
- LH:8
78
- BRF:0
79
- BRH:0
80
- end_of_record
81
- TN:
82
- SF:src/routes/create.ts
83
- FN:16,(anonymous_8)
84
- FN:16,(anonymous_9)
4
+ FN:42,(anonymous_2)
85
5
  FNF:2
86
- FNH:2
87
- FNDA:10,(anonymous_8)
88
- FNDA:10,(anonymous_9)
89
- DA:1,4
90
- DA:2,4
91
- DA:3,4
92
- DA:5,4
93
- DA:6,4
94
- DA:7,4
95
- DA:9,4
96
- DA:11,4
97
- DA:16,10
98
- DA:17,10
99
- DA:18,10
100
- DA:19,10
101
- DA:20,10
102
- DA:21,10
103
- DA:24,4
104
- LF:15
105
- LH:15
106
- BRF:0
107
- BRH:0
108
- end_of_record
109
- TN:
110
- SF:src/routes/find.ts
111
- FN:6,(anonymous_8)
112
- FN:6,(anonymous_9)
113
- FNF:2
114
- FNH:2
115
- FNDA:1,(anonymous_8)
116
- FNDA:1,(anonymous_9)
117
- DA:1,4
118
- DA:2,4
119
- DA:4,4
120
- DA:6,4
121
- DA:7,1
122
- DA:8,1
123
- DA:11,4
124
- LF:7
125
- LH:7
126
- BRF:0
127
- BRH:0
128
- end_of_record
129
- TN:
130
- SF:src/routes/get.ts
131
- FN:9,(anonymous_8)
132
- FN:9,(anonymous_9)
133
- FNF:2
134
- FNH:2
135
- FNDA:4,(anonymous_8)
136
- FNDA:4,(anonymous_9)
137
- DA:1,4
138
- DA:2,4
139
- DA:3,4
140
- DA:5,4
141
- DA:7,4
142
- DA:9,4
143
- DA:10,4
144
- DA:11,3
145
- DA:12,3
146
- DA:13,2
147
- DA:16,4
6
+ FNH:1
7
+ FNDA:0,(anonymous_1)
8
+ FNDA:4,(anonymous_2)
9
+ DA:1,1
10
+ DA:2,1
11
+ DA:12,1
12
+ DA:30,0
13
+ DA:31,0
14
+ DA:32,0
15
+ DA:37,1
16
+ DA:38,1
17
+ DA:40,1
18
+ DA:41,1
19
+ DA:43,4
148
20
  LF:11
149
- LH:11
150
- BRDA:10,0,0,1
151
- BRDA:12,1,0,1
152
- BRF:2
153
- BRH:2
154
- end_of_record
155
- TN:
156
- SF:src/routes/index.ts
157
- FNF:0
158
- FNH:0
159
- DA:1,4
160
- DA:2,4
161
- DA:3,4
162
- DA:4,4
163
- DA:6,4
164
- LF:5
165
- LH:5
21
+ LH:8
166
22
  BRF:0
167
23
  BRH:0
168
24
  end_of_record
169
- TN:
170
- SF:src/routes/update.ts
171
- FN:17,(anonymous_8)
172
- FN:17,(anonymous_9)
173
- FNF:2
174
- FNH:2
175
- FNDA:4,(anonymous_8)
176
- FNDA:4,(anonymous_9)
177
- DA:1,4
178
- DA:2,4
179
- DA:3,4
180
- DA:4,4
181
- DA:6,4
182
- DA:7,4
183
- DA:8,4
184
- DA:10,4
185
- DA:12,4
186
- DA:17,4
187
- DA:18,4
188
- DA:19,3
189
- DA:20,3
190
- DA:21,2
191
- DA:22,1
192
- DA:23,1
193
- DA:24,1
194
- DA:25,1
195
- DA:26,1
196
- DA:29,4
197
- LF:20
198
- LH:20
199
- BRDA:18,0,0,1
200
- BRDA:20,1,0,1
201
- BRDA:21,2,0,1
202
- BRF:3
203
- BRH:3
204
- end_of_record
205
- TN:
206
- SF:src/test/utils.ts
207
- FN:3,(anonymous_1)
208
- FNF:1
209
- FNH:1
210
- FNDA:7,(anonymous_1)
211
- DA:1,4
212
- DA:3,4
213
- DA:4,7
214
- LF:3
215
- LH:3
216
- BRDA:3,0,0,6
217
- BRDA:3,1,0,6
218
- BRDA:3,2,0,7
219
- BRDA:6,3,0,7
220
- BRDA:6,3,1,0
221
- BRF:5
222
- BRH:4
223
- end_of_record
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@next-k8s/tickets",
3
- "version": "1.0.23",
3
+ "version": "1.0.26",
4
4
  "main": "index.js",
5
5
  "license": "MIT",
6
6
  "scripts": {
@@ -34,7 +34,7 @@
34
34
  ]
35
35
  },
36
36
  "dependencies": {
37
- "@next-k8s/common": "^0.1.31",
37
+ "@next-k8s/common": "^0.1.34",
38
38
  "@types/cookie-session": "^2.0.44",
39
39
  "@types/express": "^4.17.13",
40
40
  "@types/jsonwebtoken": "^8.5.8",
@@ -46,6 +46,7 @@
46
46
  "jsonwebtoken": "^8.5.1",
47
47
  "mongoose": "^6.3.5",
48
48
  "mongoose-bcrypt": "^1.9.0",
49
+ "mongoose-update-if-current": "^1.4.0",
49
50
  "node-nats-streaming": "^0.3.2",
50
51
  "ts-node-dev": "^2.0.0",
51
52
  "typescript": "^4.7.3"
@@ -61,5 +62,5 @@
61
62
  "supertest": "^6.2.3",
62
63
  "ts-jest": "^28.0.4"
63
64
  },
64
- "gitHead": "68446171753023ed8f48b648220a5052b9a161d4"
65
+ "gitHead": "10be151191ede8c7f7f5c459c716e09502e8e4d1"
65
66
  }
package/pnpm-lock.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  lockfileVersion: 5.4
2
2
 
3
3
  specifiers:
4
- '@next-k8s/common': ^0.1.30
4
+ '@next-k8s/common': ^0.1.33
5
5
  '@types/body-parser': ^1.19.2
6
6
  '@types/cookie-session': ^2.0.44
7
7
  '@types/express': ^4.17.13
@@ -19,6 +19,7 @@ specifiers:
19
19
  mongodb-memory-server: ^8.6.0
20
20
  mongoose: ^6.3.5
21
21
  mongoose-bcrypt: ^1.9.0
22
+ mongoose-update-if-current: ^1.4.0
22
23
  node-nats-streaming: ^0.3.2
23
24
  node-notifier: ^10.0.1
24
25
  supertest: ^6.2.3
@@ -27,7 +28,7 @@ specifiers:
27
28
  typescript: ^4.7.3
28
29
 
29
30
  dependencies:
30
- '@next-k8s/common': 0.1.30
31
+ '@next-k8s/common': 0.1.33
31
32
  '@types/cookie-session': 2.0.44
32
33
  '@types/express': 4.17.13
33
34
  '@types/jsonwebtoken': 8.5.8
@@ -39,6 +40,7 @@ dependencies:
39
40
  jsonwebtoken: 8.5.1
40
41
  mongoose: 6.3.5
41
42
  mongoose-bcrypt: 1.9.0
43
+ mongoose-update-if-current: 1.4.0_mongoose@6.3.5
42
44
  node-nats-streaming: 0.3.2
43
45
  ts-node-dev: 2.0.0_mdwa2u5d66aaselucuqqyziihu
44
46
  typescript: 4.7.3
@@ -653,8 +655,8 @@ packages:
653
655
  '@jridgewell/resolve-uri': 3.0.7
654
656
  '@jridgewell/sourcemap-codec': 1.4.13
655
657
 
656
- /@next-k8s/common/0.1.30:
657
- resolution: {integrity: sha512-weuxOM1+zCGCSgIjYa1dAyRgJISRODxl5tolxE/yeEorVoykI+UgHUEA1y60UprnjX+BBRvujuDzBtwAsnOIng==}
658
+ /@next-k8s/common/0.1.33:
659
+ resolution: {integrity: sha512-OMNES7oDpgNcI0NXFRI5zIsn1mRga29QwIJr2Km7wXKc0tvbL+t6bZEFzR7LTYlqX0PszTc1rR5NkkGy30VPFg==}
658
660
  dependencies:
659
661
  cookie-session: 2.0.0
660
662
  express: 4.18.1
@@ -1338,6 +1340,11 @@ packages:
1338
1340
  keygrip: 1.1.0
1339
1341
  dev: false
1340
1342
 
1343
+ /core-js/3.23.4:
1344
+ resolution: {integrity: sha512-vjsKqRc1RyAJC3Ye2kYqgfdThb3zYnx9CrqoCcjMOENMtQPC7ZViBvlDxwYU/2z2NI/IPuiXw5mT4hWhddqjzQ==}
1345
+ requiresBuild: true
1346
+ dev: false
1347
+
1341
1348
  /create-require/1.1.1:
1342
1349
  resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
1343
1350
  dev: false
@@ -2700,6 +2707,18 @@ packages:
2700
2707
  - supports-color
2701
2708
  dev: false
2702
2709
 
2710
+ /mongoose-update-if-current/1.4.0_mongoose@6.3.5:
2711
+ resolution: {integrity: sha512-Rau2nvdiLExqXrSOwMMgDYQgf/fwTJQpPidTcT7C9UMQ282gTKXjDuh5vrjVvVQpfuvkiPis0tGHdXffaD54bg==}
2712
+ engines: {node: '>=8.0.0'}
2713
+ peerDependencies:
2714
+ mongoose: '>=5.0.0'
2715
+ dependencies:
2716
+ core-js: 3.23.4
2717
+ kareem: 2.3.5
2718
+ mongoose: 6.3.5
2719
+ regenerator-runtime: 0.13.9
2720
+ dev: false
2721
+
2703
2722
  /mongoose/6.3.5:
2704
2723
  resolution: {integrity: sha512-Ho3b/MK3lFyb87NjzyVwrjCqQ5DuLsIPSMFYDuZjaIJNhZfHNPQIcUDR1RLZ0/l+uznwo0VBu3WSwdu8EfAZTA==}
2705
2724
  engines: {node: '>=12.0.0'}
@@ -3003,6 +3022,10 @@ packages:
3003
3022
  picomatch: 2.3.1
3004
3023
  dev: false
3005
3024
 
3025
+ /regenerator-runtime/0.13.9:
3026
+ resolution: {integrity: sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==}
3027
+ dev: false
3028
+
3006
3029
  /require-directory/2.1.1:
3007
3030
  resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
3008
3031
  engines: {node: '>=0.10.0'}
@@ -0,0 +1,37 @@
1
+ import mongoose from 'mongoose'
2
+ import Ticket from '../ticket'
3
+
4
+ describe('[Models] Ticket Model', () => {
5
+ it('implements optimistic concurrency control', async () => {
6
+ const ticket = new Ticket({ title: 'Test Ticket', price: 20000, owner: new mongoose.Types.ObjectId().toHexString() })
7
+ await ticket.save()
8
+
9
+ const copies = [
10
+ await Ticket.findById(ticket.id),
11
+ await Ticket.findById(ticket.id)
12
+ ]
13
+
14
+ copies[0].set({ price: 15000 })
15
+ copies[1].set({ price: 23000 })
16
+
17
+ await copies[0].save()
18
+
19
+ try {
20
+ await copies[1].save()
21
+ } catch {
22
+ return
23
+ }
24
+
25
+ throw new Error('Ticket was saved when it should not have been')
26
+ })
27
+
28
+ it('increments the version number on update', async () => {
29
+ const ticket = new Ticket({ title: 'Test Ticket', price: 20000, owner: new mongoose.Types.ObjectId().toHexString() })
30
+ await ticket.save()
31
+ expect(ticket.version).toEqual(0)
32
+ await ticket.save()
33
+ expect(ticket.version).toEqual(1)
34
+ await ticket.save()
35
+ expect(ticket.version).toEqual(2)
36
+ })
37
+ })
@@ -1,4 +1,5 @@
1
1
  import mongoose, { ObjectId } from 'mongoose'
2
+ import { updateIfCurrentPlugin } from 'mongoose-update-if-current'
2
3
 
3
4
  interface TicketAttributes {
4
5
  title: String;
@@ -25,7 +26,6 @@ const ticketSchema = new mongoose.Schema({
25
26
  }
26
27
  }, {
27
28
  toJSON: {
28
- versionKey: false,
29
29
  transform (doc, ret) {
30
30
  ret.id = ret._id
31
31
  delete ret._id
@@ -34,6 +34,9 @@ const ticketSchema = new mongoose.Schema({
34
34
  }
35
35
  })
36
36
 
37
+ ticketSchema.set('versionKey', 'version')
38
+ ticketSchema.plugin(updateIfCurrentPlugin)
39
+
37
40
  export const TicketModel = mongoose.model('Ticket', ticketSchema)
38
41
  export default class Ticket extends TicketModel {
39
42
  constructor(attributes: TicketAttributes) {
@@ -3,7 +3,7 @@ import { body } from 'express-validator'
3
3
  import { requireAuth, validateRequest } from '@next-k8s/common'
4
4
 
5
5
  import Ticket from '../models/ticket'
6
- import { TicketCreatedPublisher } from '../events/publishers/tickets/created'
6
+ import TicketCreatedPublisher from '../events/publishers/created'
7
7
  import natsClient from '../nats-client'
8
8
 
9
9
  const router = express.Router()
@@ -2,9 +2,8 @@ import { BadRequestError, NotFoundError, UnauthorizedError, validateRequest, req
2
2
  import express, { Request, Response } from 'express'
3
3
  import { body } from 'express-validator'
4
4
  import { isValidObjectId } from 'mongoose'
5
-
6
5
  import Ticket from '../models/ticket'
7
- import TicketUpdatedPublisher from '../events/publishers/tickets/updated'
6
+ import TicketUpdatedPublisher from '../events/publishers/updated'
8
7
  import natsClient from '../nats-client'
9
8
 
10
9
  const router = express.Router()