2020-04-16 20:38:40 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								'use strict' ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-12-18 11:43:29 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								const  _  =  require ( 'lodash' ) ;  
						 
					
						
							
								
									
										
										
										
											2020-04-16 20:38:40 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								const  assert  =  require ( 'assert' ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								const  path  =  require ( 'path' ) ;  
						 
					
						
							
								
									
										
										
										
											2020-10-27 11:02:20 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								const  fs  =  require ( 'fs' ) ;  
						 
					
						
							
								
									
										
										
										
											2020-04-16 20:38:40 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								const  SwaggerParser  =  require ( '@apidevtools/swagger-parser' ) ;  
						 
					
						
							
								
									
										
										
										
											2020-04-23 21:50:08 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								const  nconf  =  require ( 'nconf' ) ;  
						 
					
						
							
								
									
										
										
										
											2020-12-22 13:18:18 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								const  jwt  =  require ( 'jsonwebtoken' ) ;  
						 
					
						
							
								
									
										
										
										
											2020-06-23 00:46:59 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								const  util  =  require ( 'util' ) ;  
						 
					
						
							
								
									
										
										
										
											2021-02-03 23:53:16 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-06-23 00:46:59 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								const  wait  =  util . promisify ( setTimeout ) ;  
						 
					
						
							
								
									
										
										
										
											2020-04-16 20:38:40 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-04-23 21:50:08 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								const  db  =  require ( './mocks/databasemock' ) ;  
						 
					
						
							
								
									
										
										
										
											2025-08-28 09:55:13 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								const  request  =  require ( '../src/request' ) ;  
						 
					
						
							
								
									
										
										
										
											2020-04-23 21:50:08 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								const  helpers  =  require ( './helpers' ) ;  
						 
					
						
							
								
									
										
										
										
											2020-10-26 21:51:25 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								const  meta  =  require ( '../src/meta' ) ;  
						 
					
						
							
								
									
										
										
										
											2020-04-23 21:50:08 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								const  user  =  require ( '../src/user' ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								const  groups  =  require ( '../src/groups' ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								const  categories  =  require ( '../src/categories' ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								const  topics  =  require ( '../src/topics' ) ;  
						 
					
						
							
								
									
										
										
										
											2021-02-03 12:34:13 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								const  posts  =  require ( '../src/posts' ) ;  
						 
					
						
							
								
									
										
										
										
											2020-04-23 21:50:08 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								const  plugins  =  require ( '../src/plugins' ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								const  flags  =  require ( '../src/flags' ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								const  messaging  =  require ( '../src/messaging' ) ;  
						 
					
						
							
								
									
										
										
										
											2024-06-17 14:46:53 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								const  activitypub  =  require ( '../src/activitypub' ) ;  
						 
					
						
							
								
									
										
										
										
											2020-10-26 21:51:25 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								const  utils  =  require ( '../src/utils' ) ;  
						 
					
						
							
								
									
										
											 
										
											
												Bootstrap5 (#10894)
* chore: up deps
* chore: up composer
* fix(deps): bump 2factor to v7
* chore: up harmony
* chore: up harmony
* fix: missing await
* feat: allow middlewares to pass in template values via res.locals
* feat: buildAccountData middleware automatically added ot all account routes
* fix: properly allow values in res.locals.templateValues to be added to the template data
* refactor: user/blocks
* refactor(accounts): categories and consent
* feat: automatically 404 if exposeUid or exposeGroupName come up empty
* refactor: remove calls to getUserDataByUserSlug for most account routes, since it is populated via middleware now
* fix: allow exposeUid and exposeGroupName to work with slugs with mixed capitalization
* fix: move reputation removal check to accountHelpers method
* test: skip i18n tests if ref branch when present is not develop
* fix(deps): bump theme versions
* fix(deps): bump ntfy and 2factor
* chore: up harmony
* fix: add missing return
* fix: #11191, only focus on search input on md environments and up
* feat: allow file uploads on mobile chat
closes https://github.com/NodeBB/NodeBB/issues/11217
* chore: up themes
* chore: add lang string
* fix(deps): bump ntfy to 1.0.15
* refactor: use new if/each syntax
* chore: up composer
* fix: regression from user helper refactor
* chore: up harmony
* chore: up composer
* chore: up harmony
* chore: up harmony
* chore: up harmony
* chore: fix composer version
* feat: add increment helper
* chore: up harmony
* fix: #11228 no timestamps in future :hourglass:
* chore: up harmony
* check config.theme as well
fire action:posts.loaded after processing dom
* chore: up harmony
* chore: up harmony
* chore: up harmony
* chore: up themes
* chore: up harmony
* remove extra class
* refactor: move these to core from harmony
* chore: up widgets
* chore: up widgets
* height auto
* fix: closes #11238
* dont focus inputs, annoying on mobile
* fix: dont focus twice, only focus on chat input on desktop
dont wrap widget footer in row
* chore: up harmony
* chore: up harmony
* update chat window
* chore: up themes
* fix cache buster for skins
* chat fixes
* chore: up harmony
* chore: up composer
* refactor: change hook logs to debug
* fix: scroll to post right after adding to dom
* fix: hash scrolling and highlighting correct post
* test: re-enable read API schema tests
* fix: add back schema changes for 179faa2270f2ad955dcc4a7b04755acce59e6ffd and c3920ccb10d8ead2dcd9914bb1784bed3f6adfd4
* fix: schema changes from 488f0978a4aa1ca1e4d2a1f2e8c7ef7a681f2f27
* fix: schema changes for f4cf482a874701ce80c0f306c49d8788cec66f87
* fix: schema update for be6bbabd0e2551fbe9571dcf3ee40ad721764543
* fix: schema changes for 69c96078ea78ee2c45885a90a6f6a59f9042a33c
* fix: schema changes for d1364c313021e48a879a818b24947e1457c062f7
* fix: schema changes for 84ff1152f7552dd866e25a90972d970b9861107e
* fix: schema changes for b860c2605c209e0650ef98f4c80d842ea23a51ce
* fix: schema changes for 23cb67a1126481848fac39aafd1e253441e76d7f
* fix: schema changes for b916e42f400dac8aa51670b15e439f87f0eb8939
* fix: schema change for a9bbb586fcb3a1c61b5fb69052236e78cdf7d743
* fix: schema changes for 4b738c8cd36c936a1dbe2bb900c694bf6c5520ec
* fix: schema changes for 58b5781cea9acb129e6604a82ab5a5bfc0d8394d
* fix: schema changes for 794bf01b21709c4be06584d576d706b3d6342057
* fix: schema changes for 80ea12c1c1963f5b39fb64841e4f3c8da3c87af2, e368feef51e0766f119c9710fb4db8f64724725c, and 52ead114bec961c62fa2eb0786540e229f6e4873
* fix: composer-default object in config?
* fix: schema changes for 9acdc6808c070555352951c651921df181b10993 and 093093420027999df3c67bf0ea6024f6dbf81d2d
* fix: schema changes for c0a52924f1f7ef8caeaacda67363ac269b56042c
* fix: schema change for aba420a3f3b774e949c2539c73f3dc0e1ae79a38, move loggedInUser to optional props
* fix: schema changes for 8c67031609da30d788561459f8bb76e9a69253de
* fix: schema changes for 27e53b42f3ce48fa61d3754375715cd41ffe808d
* fix: schema changes for 28359665187b0a3b9ec6226dca1234ebdbd725a5
* fix: breaking test for email confirmation API call
* fix: schema changes for refactored search page
* fix: schema changes for user object
* fix: schema changes for 9f531f957e08eabb4bae844ddd67bde14d9b59f0
* fix: schema changes for c4042c70decd628e5b880bd109515b47e4e16164 and 23175110a29640e6fa052db1079bfedb34a61055
* fix: schema changes for 9b3616b10392e247974eb0c1e6225a1582bf6c69
* fix: schema changes for 5afd5de07d42fd33f039a6f85ded3b4992200e5a
* fix: schema change for 1d7baf12171cffbd3af8914bef4e6297d1160d49
* fix: schema changes for 57bfb37c55a839662144e684875003ab52315ecc and be6bbabd0e2551fbe9571dcf3ee40ad721764543
* fix: schema changes for 6e86b4afa20d662af8b9f1c07518df2d8c258105 and 3efad2e13b7319eb9a1f4fda7af047be43ebc11f and 68f66223e73a72f378f193c83a9b5546bede2cda
* fix: allowing optional qs prop in pagination keys (not sure why this didn't break before)
* fix: re-login on email change
* fix: schema changes for c926358d734a2fa410de87f4e4a91744215fc14a
* fix: schema changes for 388a8270c9882892bad5c8141f65da8d59eac0fd
* fix: schema change for 2658bcc821c22e137a6eeb9bb74098856a642eaf
* fix: no need to call account middlewares for chats routes
* fix: schema changes for 71743affc3e58dc85d4ffa15ce043d4d9ddd3d67
* fix: final schema changes
* test: support for anyOf and oneOf
* fix: check thumb
* dont scroll to top on back press
* remove group log
* fix: add top margin to merged and deleted alerts
* chore: up widgets
* fix: improve fix-lists mixin
* chore: up harmony/composer
* feat: allow hiding quicksearch results during search
* dont record searches made by composer
* chore: up 54
* chore: up spam be gone
* feat: add prev/next page and page count into mobile paginator
* chore: up harmony
* chore: up harmony
* use old style for IS
* fix: hide entire toolbar row if no posts or not singlePost
* fix: updated messaging for post-queue template, #11206
* fix: btn-sm on post queue back button
* fix: bump harmony, closes #11206
* fix: remove unused alert module import
* fix: bump harmony
* fix: bump harmony
* chore: up harmony
* refactor: IS scrolltop
* fix: update users:search-user-for-chat source string
* feat: support for mark-read toggle on chats dropdown and recent chats list
* feat: api v3 calls to mark chat read/unread
* feat: send event:chats.mark socket event on mark read or unread
* refactor: allow frontend to mark chats as unread, use new API v3 routes instead of socket calls, better frontend event handling
* docs: openapi schema updates for chat marking
* fix: allow unread state toggling in chats dropdown too
* fix: issue where repeated openings of the chats dropdown would continually add events for mark-read/unread
* fix: debug log
* refactor: move userSearch filter to a module
* feat(routes): allow remounting /categories (#11230)
* feat: send flags count to frontend on flags list page
* refactor: filter form client-side js to extract out some logic
* fix: applyFilters to not take any arguments, update selectedCids in updateButton instead of onHidden
* fix: use userFilter module for assignee, reporterId, targetUid
* fix(openapi): schema changes for updated flags page
* fix: dont allow adding duplicates to userFilter
* use same var
* remove log
* fix: closes #11282
* feat: lang key for x-topics
* chore: up harmony
* chore: up emoji
* chore: up harmony
* fix: update userFilter to allow new option `selectedBlock`
* fix: wrong block name passed to userFilter
* fix: https://github.com/NodeBB/NodeBB/issues/11283
* fix: chats, allow multiple dropdowns like in harmony
* chore: up harmony
* refactor: flag note adding/editing, closes #11285
* fix: remove old prepareEdit logic
* chore: add caveat about hacky code block in userFilter module
* fix: placeholders for userFilter module
* refactor: navigator so it works with multiple thumbs/navigators
* chore: up harmony
* fix: closes #11287, destroy quick reply autocomplete
on navigation
* fix: filter disabled categories on user categories page count
* chore: up harmony
* docs: update openapi spec to include info about passing in timestamps for topic creation, removing timestamp as valid request param for topic replying
* fix: send back null values on ACP search dashboard for startDate and endDate if not expicitly passed in, fix tests
* fix: tweak table order in ACP dash searches
* fix: only invoke navigator click drag on left mouse button
* feat: add back unread indicator to navigator
* clear bookmark on mark unread
* fix: navigator crash on ajaxify
* better thumb top calculation
* fix: reset user bookmark when topic is marked unread
* Revert "fix: reset user bookmark when topic is marked unread"
This reverts commit 9bcd85c2c6848c3d325d32027261809da6e11c9e.
* fix: update unread indicator on scroll, add unread count
* chore: bump harmony
* fix: crash on navigator unread update when backing out of a topic
* fix: closes #11183
* fix: update topics:recent zset when rescheduling a topic
* fix: dupe quote button, increase delay, hide immediately on empty selection
* fix: navigator not showing up on first load
* refactor: remove glance
assorted fixes to navigator
dont reduce remaning count if user scrolls down and up quickly
only call topic.navigatorCallback when index changes
* more sanity checks for bookmark
dont allow setting bookmark higher than topic postcount
* closes #11218, :train:
* Revert "fix: update topics:recent zset when rescheduling a topic"
This reverts commit 737973cca9e94b6cb3867492a09e1e0b1af391d5.
* fix: #11306, show proper error if queued post doesn't exist
was showing no-privileges if someone else accepted the post
* https://github.com/NodeBB/NodeBB/issues/11307
dont use li
* chore: up harmony
* chore: bump version string
* fix: copy paste fail
* feat: closes #7382, tag filtering
add client side support for filtering by tags on /category, /recent and /unread
* chore: up harmony
* chore: up harmony
* Revert "fix: add back req.query fallback for backwards compatibility" [breaking]
This reverts commit cf6cc2c454dc35c330393c62ee8ce67b42d8eefb.
This commit is no longer required as passing in a CSRF token via query parameter is no longer supported as of NodeBB v3.x
This is a breaking change.
* fix: pass csrf token in form data, re: NodeBB/NodeBB#11309
* chore: up deps
* fix: tests, use x-csrf-token query param removed
* test: fix csrf_token
* lint: remove unused
* feat: add itemprop="image" to avatar helper
* fix: get chat upload button in chat modal
* breaking: remove deprecated socket.io methods
* test: update messaging tests to not use sockets
* fix: parent post links
* fix: prevent post tooltip if mouse leaves before data/tpl is loaded
* chore: up harmony
* chore: up harmony
* chore: up harmony
* chore: up harmony
* fix: nested replies indices
* fix(deps): bump 2factor
* feat: add loggedIn user to all api routes
* chore: up themes
* refactor: audit admin v3 write api routes as per #11321
* refactor: audit category v3 write api routes as per #11321 [breaking]
docs: fix open api spec for #11321
* refactor: audit chat v3 write api routes as per #11321
* refactor: audit files v3 write api routes as per #11321
* refactor: audit flags v3 write api routes as per #11321
* refactor: audit posts v3 write api routes as per #11321
* refactor: audit topics v3 write api routes as per #11321
* refactor: audit users v3 write api routes as per #11321
* fix: lang string
* remove min height
* fix: empty topic/labels taking up space
* fix: tag filtering when changing filter to watched topics
or changing popular time limit to month
* chore: up harmony
* fix: closes #11354, show no post error if queued post already accepted/rejected
* test: #11354
* test: #11354
* fix(deps): bump 2factor
* fix: #11357 clear cache on thumb remove
* fix: thumb remove on windows, closes #11357
* test: openapi for thumbs
* test: fix openapi
---------
Co-authored-by: Julian Lam <julian@nodebb.org>
Co-authored-by: Opliko <opliko.reg@protonmail.com>
											 
										 
										
											2023-03-17 11:58:31 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								const  api  =  require ( '../src/api' ) ;  
						 
					
						
							
								
									
										
										
										
											2020-04-23 21:50:08 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-12 14:32:49 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								describe ( 'API' ,  async  ( )  =>  {  
						 
					
						
							
								
									
										
										
										
											2020-04-23 21:50:08 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									let  readApi  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-24 11:01:53 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									let  writeApi  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  readApiPath  =  path . resolve ( _ _dirname ,  '../public/openapi/read.yaml' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  writeApiPath  =  path . resolve ( _ _dirname ,  '../public/openapi/write.yaml' ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-23 21:50:08 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									let  jar ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-26 21:51:25 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									let  csrfToken ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-23 21:50:08 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									let  setup  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-18 16:42:18 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									const  unauthenticatedRoutes  =  [ '/api/login' ,  '/api/register' ] ;  // Everything else will be called with the admin user
 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-23 21:50:08 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-10-26 21:51:25 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									const  mocks  =  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-12 14:32:49 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										head :  { } , 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-22 13:18:18 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										get :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											'/api/email/unsubscribe/{token}' :  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													in :  'path' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													name :  'token' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													example :  ( ( )  =>  jwt . sign ( { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														template :  'digest' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														uid :  1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} ,  nconf . get ( 'secret' ) ) ) ( ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											] , 
							 
						 
					
						
							
								
									
										
											 
										
											
												Bootstrap5 (#10894)
* chore: up deps
* chore: up composer
* fix(deps): bump 2factor to v7
* chore: up harmony
* chore: up harmony
* fix: missing await
* feat: allow middlewares to pass in template values via res.locals
* feat: buildAccountData middleware automatically added ot all account routes
* fix: properly allow values in res.locals.templateValues to be added to the template data
* refactor: user/blocks
* refactor(accounts): categories and consent
* feat: automatically 404 if exposeUid or exposeGroupName come up empty
* refactor: remove calls to getUserDataByUserSlug for most account routes, since it is populated via middleware now
* fix: allow exposeUid and exposeGroupName to work with slugs with mixed capitalization
* fix: move reputation removal check to accountHelpers method
* test: skip i18n tests if ref branch when present is not develop
* fix(deps): bump theme versions
* fix(deps): bump ntfy and 2factor
* chore: up harmony
* fix: add missing return
* fix: #11191, only focus on search input on md environments and up
* feat: allow file uploads on mobile chat
closes https://github.com/NodeBB/NodeBB/issues/11217
* chore: up themes
* chore: add lang string
* fix(deps): bump ntfy to 1.0.15
* refactor: use new if/each syntax
* chore: up composer
* fix: regression from user helper refactor
* chore: up harmony
* chore: up composer
* chore: up harmony
* chore: up harmony
* chore: up harmony
* chore: fix composer version
* feat: add increment helper
* chore: up harmony
* fix: #11228 no timestamps in future :hourglass:
* chore: up harmony
* check config.theme as well
fire action:posts.loaded after processing dom
* chore: up harmony
* chore: up harmony
* chore: up harmony
* chore: up themes
* chore: up harmony
* remove extra class
* refactor: move these to core from harmony
* chore: up widgets
* chore: up widgets
* height auto
* fix: closes #11238
* dont focus inputs, annoying on mobile
* fix: dont focus twice, only focus on chat input on desktop
dont wrap widget footer in row
* chore: up harmony
* chore: up harmony
* update chat window
* chore: up themes
* fix cache buster for skins
* chat fixes
* chore: up harmony
* chore: up composer
* refactor: change hook logs to debug
* fix: scroll to post right after adding to dom
* fix: hash scrolling and highlighting correct post
* test: re-enable read API schema tests
* fix: add back schema changes for 179faa2270f2ad955dcc4a7b04755acce59e6ffd and c3920ccb10d8ead2dcd9914bb1784bed3f6adfd4
* fix: schema changes from 488f0978a4aa1ca1e4d2a1f2e8c7ef7a681f2f27
* fix: schema changes for f4cf482a874701ce80c0f306c49d8788cec66f87
* fix: schema update for be6bbabd0e2551fbe9571dcf3ee40ad721764543
* fix: schema changes for 69c96078ea78ee2c45885a90a6f6a59f9042a33c
* fix: schema changes for d1364c313021e48a879a818b24947e1457c062f7
* fix: schema changes for 84ff1152f7552dd866e25a90972d970b9861107e
* fix: schema changes for b860c2605c209e0650ef98f4c80d842ea23a51ce
* fix: schema changes for 23cb67a1126481848fac39aafd1e253441e76d7f
* fix: schema changes for b916e42f400dac8aa51670b15e439f87f0eb8939
* fix: schema change for a9bbb586fcb3a1c61b5fb69052236e78cdf7d743
* fix: schema changes for 4b738c8cd36c936a1dbe2bb900c694bf6c5520ec
* fix: schema changes for 58b5781cea9acb129e6604a82ab5a5bfc0d8394d
* fix: schema changes for 794bf01b21709c4be06584d576d706b3d6342057
* fix: schema changes for 80ea12c1c1963f5b39fb64841e4f3c8da3c87af2, e368feef51e0766f119c9710fb4db8f64724725c, and 52ead114bec961c62fa2eb0786540e229f6e4873
* fix: composer-default object in config?
* fix: schema changes for 9acdc6808c070555352951c651921df181b10993 and 093093420027999df3c67bf0ea6024f6dbf81d2d
* fix: schema changes for c0a52924f1f7ef8caeaacda67363ac269b56042c
* fix: schema change for aba420a3f3b774e949c2539c73f3dc0e1ae79a38, move loggedInUser to optional props
* fix: schema changes for 8c67031609da30d788561459f8bb76e9a69253de
* fix: schema changes for 27e53b42f3ce48fa61d3754375715cd41ffe808d
* fix: schema changes for 28359665187b0a3b9ec6226dca1234ebdbd725a5
* fix: breaking test for email confirmation API call
* fix: schema changes for refactored search page
* fix: schema changes for user object
* fix: schema changes for 9f531f957e08eabb4bae844ddd67bde14d9b59f0
* fix: schema changes for c4042c70decd628e5b880bd109515b47e4e16164 and 23175110a29640e6fa052db1079bfedb34a61055
* fix: schema changes for 9b3616b10392e247974eb0c1e6225a1582bf6c69
* fix: schema changes for 5afd5de07d42fd33f039a6f85ded3b4992200e5a
* fix: schema change for 1d7baf12171cffbd3af8914bef4e6297d1160d49
* fix: schema changes for 57bfb37c55a839662144e684875003ab52315ecc and be6bbabd0e2551fbe9571dcf3ee40ad721764543
* fix: schema changes for 6e86b4afa20d662af8b9f1c07518df2d8c258105 and 3efad2e13b7319eb9a1f4fda7af047be43ebc11f and 68f66223e73a72f378f193c83a9b5546bede2cda
* fix: allowing optional qs prop in pagination keys (not sure why this didn't break before)
* fix: re-login on email change
* fix: schema changes for c926358d734a2fa410de87f4e4a91744215fc14a
* fix: schema changes for 388a8270c9882892bad5c8141f65da8d59eac0fd
* fix: schema change for 2658bcc821c22e137a6eeb9bb74098856a642eaf
* fix: no need to call account middlewares for chats routes
* fix: schema changes for 71743affc3e58dc85d4ffa15ce043d4d9ddd3d67
* fix: final schema changes
* test: support for anyOf and oneOf
* fix: check thumb
* dont scroll to top on back press
* remove group log
* fix: add top margin to merged and deleted alerts
* chore: up widgets
* fix: improve fix-lists mixin
* chore: up harmony/composer
* feat: allow hiding quicksearch results during search
* dont record searches made by composer
* chore: up 54
* chore: up spam be gone
* feat: add prev/next page and page count into mobile paginator
* chore: up harmony
* chore: up harmony
* use old style for IS
* fix: hide entire toolbar row if no posts or not singlePost
* fix: updated messaging for post-queue template, #11206
* fix: btn-sm on post queue back button
* fix: bump harmony, closes #11206
* fix: remove unused alert module import
* fix: bump harmony
* fix: bump harmony
* chore: up harmony
* refactor: IS scrolltop
* fix: update users:search-user-for-chat source string
* feat: support for mark-read toggle on chats dropdown and recent chats list
* feat: api v3 calls to mark chat read/unread
* feat: send event:chats.mark socket event on mark read or unread
* refactor: allow frontend to mark chats as unread, use new API v3 routes instead of socket calls, better frontend event handling
* docs: openapi schema updates for chat marking
* fix: allow unread state toggling in chats dropdown too
* fix: issue where repeated openings of the chats dropdown would continually add events for mark-read/unread
* fix: debug log
* refactor: move userSearch filter to a module
* feat(routes): allow remounting /categories (#11230)
* feat: send flags count to frontend on flags list page
* refactor: filter form client-side js to extract out some logic
* fix: applyFilters to not take any arguments, update selectedCids in updateButton instead of onHidden
* fix: use userFilter module for assignee, reporterId, targetUid
* fix(openapi): schema changes for updated flags page
* fix: dont allow adding duplicates to userFilter
* use same var
* remove log
* fix: closes #11282
* feat: lang key for x-topics
* chore: up harmony
* chore: up emoji
* chore: up harmony
* fix: update userFilter to allow new option `selectedBlock`
* fix: wrong block name passed to userFilter
* fix: https://github.com/NodeBB/NodeBB/issues/11283
* fix: chats, allow multiple dropdowns like in harmony
* chore: up harmony
* refactor: flag note adding/editing, closes #11285
* fix: remove old prepareEdit logic
* chore: add caveat about hacky code block in userFilter module
* fix: placeholders for userFilter module
* refactor: navigator so it works with multiple thumbs/navigators
* chore: up harmony
* fix: closes #11287, destroy quick reply autocomplete
on navigation
* fix: filter disabled categories on user categories page count
* chore: up harmony
* docs: update openapi spec to include info about passing in timestamps for topic creation, removing timestamp as valid request param for topic replying
* fix: send back null values on ACP search dashboard for startDate and endDate if not expicitly passed in, fix tests
* fix: tweak table order in ACP dash searches
* fix: only invoke navigator click drag on left mouse button
* feat: add back unread indicator to navigator
* clear bookmark on mark unread
* fix: navigator crash on ajaxify
* better thumb top calculation
* fix: reset user bookmark when topic is marked unread
* Revert "fix: reset user bookmark when topic is marked unread"
This reverts commit 9bcd85c2c6848c3d325d32027261809da6e11c9e.
* fix: update unread indicator on scroll, add unread count
* chore: bump harmony
* fix: crash on navigator unread update when backing out of a topic
* fix: closes #11183
* fix: update topics:recent zset when rescheduling a topic
* fix: dupe quote button, increase delay, hide immediately on empty selection
* fix: navigator not showing up on first load
* refactor: remove glance
assorted fixes to navigator
dont reduce remaning count if user scrolls down and up quickly
only call topic.navigatorCallback when index changes
* more sanity checks for bookmark
dont allow setting bookmark higher than topic postcount
* closes #11218, :train:
* Revert "fix: update topics:recent zset when rescheduling a topic"
This reverts commit 737973cca9e94b6cb3867492a09e1e0b1af391d5.
* fix: #11306, show proper error if queued post doesn't exist
was showing no-privileges if someone else accepted the post
* https://github.com/NodeBB/NodeBB/issues/11307
dont use li
* chore: up harmony
* chore: bump version string
* fix: copy paste fail
* feat: closes #7382, tag filtering
add client side support for filtering by tags on /category, /recent and /unread
* chore: up harmony
* chore: up harmony
* Revert "fix: add back req.query fallback for backwards compatibility" [breaking]
This reverts commit cf6cc2c454dc35c330393c62ee8ce67b42d8eefb.
This commit is no longer required as passing in a CSRF token via query parameter is no longer supported as of NodeBB v3.x
This is a breaking change.
* fix: pass csrf token in form data, re: NodeBB/NodeBB#11309
* chore: up deps
* fix: tests, use x-csrf-token query param removed
* test: fix csrf_token
* lint: remove unused
* feat: add itemprop="image" to avatar helper
* fix: get chat upload button in chat modal
* breaking: remove deprecated socket.io methods
* test: update messaging tests to not use sockets
* fix: parent post links
* fix: prevent post tooltip if mouse leaves before data/tpl is loaded
* chore: up harmony
* chore: up harmony
* chore: up harmony
* chore: up harmony
* fix: nested replies indices
* fix(deps): bump 2factor
* feat: add loggedIn user to all api routes
* chore: up themes
* refactor: audit admin v3 write api routes as per #11321
* refactor: audit category v3 write api routes as per #11321 [breaking]
docs: fix open api spec for #11321
* refactor: audit chat v3 write api routes as per #11321
* refactor: audit files v3 write api routes as per #11321
* refactor: audit flags v3 write api routes as per #11321
* refactor: audit posts v3 write api routes as per #11321
* refactor: audit topics v3 write api routes as per #11321
* refactor: audit users v3 write api routes as per #11321
* fix: lang string
* remove min height
* fix: empty topic/labels taking up space
* fix: tag filtering when changing filter to watched topics
or changing popular time limit to month
* chore: up harmony
* fix: closes #11354, show no post error if queued post already accepted/rejected
* test: #11354
* test: #11354
* fix(deps): bump 2factor
* fix: #11357 clear cache on thumb remove
* fix: thumb remove on windows, closes #11357
* test: openapi for thumbs
* test: fix openapi
---------
Co-authored-by: Julian Lam <julian@nodebb.org>
Co-authored-by: Opliko <opliko.reg@protonmail.com>
											 
										 
										
											2023-03-17 11:58:31 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											'/api/confirm/{code}' :  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													in :  'path' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													name :  'code' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													example :  '' ,  // to be defined later...
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											] , 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-10 15:16:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											'/admin/tokens/{token}' :  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													in :  'path' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													name :  'token' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													example :  '' ,  // to be defined later...
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										post :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											'/admin/tokens/{token}/roll' :  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													in :  'path' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													name :  'token' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													example :  '' ,  // to be defined later...
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											] , 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-22 13:18:18 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-31 12:24:26 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										put :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											'/groups/{slug}/pending/{uid}' :  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													in :  'path' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													name :  'slug' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													example :  'private-group' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													in :  'path' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													name :  'uid' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													example :  '' ,  // to be defined later...
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											] , 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-10 15:16:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											'/admin/tokens/{token}' :  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													in :  'path' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													name :  'token' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													example :  '' ,  // to be defined later...
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											] , 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-31 12:24:26 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-30 21:17:25 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										patch :  { } , 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-26 21:51:25 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										delete :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											'/users/{uid}/tokens/{token}' :  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													in :  'path' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													name :  'uid' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													example :  1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													in :  'path' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													name :  'token' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													example :  utils . generateUUID ( ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											] , 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-12 15:53:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											'/users/{uid}/sessions/{uuid}' :  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													in :  'path' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													name :  'uid' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													example :  1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													in :  'path' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													name :  'uuid' , 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-18 16:42:18 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													example :  '' ,  // to be defined below...
 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-12 15:53:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											] , 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-03 12:34:13 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											'/posts/{pid}/diffs/{timestamp}' :  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													in :  'path' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													name :  'pid' , 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-18 16:42:18 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													example :  '' ,  // to be defined below...
 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-03 12:34:13 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													in :  'path' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													name :  'timestamp' , 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-18 16:42:18 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													example :  '' ,  // to be defined below...
 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-03 12:34:13 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											] , 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-31 12:24:26 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											'/groups/{slug}/pending/{uid}' :  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													in :  'path' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													name :  'slug' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													example :  'private-group' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													in :  'path' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													name :  'uid' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													example :  '' ,  // to be defined later...
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											] , 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-31 15:37:13 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											'/groups/{slug}/invites/{uid}' :  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													in :  'path' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													name :  'slug' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													example :  'invitations-only' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													in :  'path' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													name :  'uid' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													example :  '' ,  // to be defined later...
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											] , 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-10 15:16:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											'/admin/tokens/{token}' :  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													in :  'path' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													name :  'token' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													example :  '' ,  // to be defined later...
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											] , 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-26 21:51:25 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-04-23 21:50:08 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									async  function  dummySearchHook ( data )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  [ 1 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-05 14:25:14 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									async  function  dummyEmailerHook ( data )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// pretend to handle sending emails
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-23 21:50:08 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-02-04 00:01:39 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									after ( async  ( )  =>  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-27 17:36:58 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										plugins . hooks . unregister ( 'core' ,  'filter:search.query' ,  dummySearchHook ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-05 10:41:23 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										plugins . hooks . unregister ( 'emailer-test' ,  'static:email.send' ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-23 21:50:08 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									async  function  setupData ( )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( setup )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Create sample users
 
							 
						 
					
						
							
								
									
										
											 
										
											
												Bootstrap5 (#10894)
* chore: up deps
* chore: up composer
* fix(deps): bump 2factor to v7
* chore: up harmony
* chore: up harmony
* fix: missing await
* feat: allow middlewares to pass in template values via res.locals
* feat: buildAccountData middleware automatically added ot all account routes
* fix: properly allow values in res.locals.templateValues to be added to the template data
* refactor: user/blocks
* refactor(accounts): categories and consent
* feat: automatically 404 if exposeUid or exposeGroupName come up empty
* refactor: remove calls to getUserDataByUserSlug for most account routes, since it is populated via middleware now
* fix: allow exposeUid and exposeGroupName to work with slugs with mixed capitalization
* fix: move reputation removal check to accountHelpers method
* test: skip i18n tests if ref branch when present is not develop
* fix(deps): bump theme versions
* fix(deps): bump ntfy and 2factor
* chore: up harmony
* fix: add missing return
* fix: #11191, only focus on search input on md environments and up
* feat: allow file uploads on mobile chat
closes https://github.com/NodeBB/NodeBB/issues/11217
* chore: up themes
* chore: add lang string
* fix(deps): bump ntfy to 1.0.15
* refactor: use new if/each syntax
* chore: up composer
* fix: regression from user helper refactor
* chore: up harmony
* chore: up composer
* chore: up harmony
* chore: up harmony
* chore: up harmony
* chore: fix composer version
* feat: add increment helper
* chore: up harmony
* fix: #11228 no timestamps in future :hourglass:
* chore: up harmony
* check config.theme as well
fire action:posts.loaded after processing dom
* chore: up harmony
* chore: up harmony
* chore: up harmony
* chore: up themes
* chore: up harmony
* remove extra class
* refactor: move these to core from harmony
* chore: up widgets
* chore: up widgets
* height auto
* fix: closes #11238
* dont focus inputs, annoying on mobile
* fix: dont focus twice, only focus on chat input on desktop
dont wrap widget footer in row
* chore: up harmony
* chore: up harmony
* update chat window
* chore: up themes
* fix cache buster for skins
* chat fixes
* chore: up harmony
* chore: up composer
* refactor: change hook logs to debug
* fix: scroll to post right after adding to dom
* fix: hash scrolling and highlighting correct post
* test: re-enable read API schema tests
* fix: add back schema changes for 179faa2270f2ad955dcc4a7b04755acce59e6ffd and c3920ccb10d8ead2dcd9914bb1784bed3f6adfd4
* fix: schema changes from 488f0978a4aa1ca1e4d2a1f2e8c7ef7a681f2f27
* fix: schema changes for f4cf482a874701ce80c0f306c49d8788cec66f87
* fix: schema update for be6bbabd0e2551fbe9571dcf3ee40ad721764543
* fix: schema changes for 69c96078ea78ee2c45885a90a6f6a59f9042a33c
* fix: schema changes for d1364c313021e48a879a818b24947e1457c062f7
* fix: schema changes for 84ff1152f7552dd866e25a90972d970b9861107e
* fix: schema changes for b860c2605c209e0650ef98f4c80d842ea23a51ce
* fix: schema changes for 23cb67a1126481848fac39aafd1e253441e76d7f
* fix: schema changes for b916e42f400dac8aa51670b15e439f87f0eb8939
* fix: schema change for a9bbb586fcb3a1c61b5fb69052236e78cdf7d743
* fix: schema changes for 4b738c8cd36c936a1dbe2bb900c694bf6c5520ec
* fix: schema changes for 58b5781cea9acb129e6604a82ab5a5bfc0d8394d
* fix: schema changes for 794bf01b21709c4be06584d576d706b3d6342057
* fix: schema changes for 80ea12c1c1963f5b39fb64841e4f3c8da3c87af2, e368feef51e0766f119c9710fb4db8f64724725c, and 52ead114bec961c62fa2eb0786540e229f6e4873
* fix: composer-default object in config?
* fix: schema changes for 9acdc6808c070555352951c651921df181b10993 and 093093420027999df3c67bf0ea6024f6dbf81d2d
* fix: schema changes for c0a52924f1f7ef8caeaacda67363ac269b56042c
* fix: schema change for aba420a3f3b774e949c2539c73f3dc0e1ae79a38, move loggedInUser to optional props
* fix: schema changes for 8c67031609da30d788561459f8bb76e9a69253de
* fix: schema changes for 27e53b42f3ce48fa61d3754375715cd41ffe808d
* fix: schema changes for 28359665187b0a3b9ec6226dca1234ebdbd725a5
* fix: breaking test for email confirmation API call
* fix: schema changes for refactored search page
* fix: schema changes for user object
* fix: schema changes for 9f531f957e08eabb4bae844ddd67bde14d9b59f0
* fix: schema changes for c4042c70decd628e5b880bd109515b47e4e16164 and 23175110a29640e6fa052db1079bfedb34a61055
* fix: schema changes for 9b3616b10392e247974eb0c1e6225a1582bf6c69
* fix: schema changes for 5afd5de07d42fd33f039a6f85ded3b4992200e5a
* fix: schema change for 1d7baf12171cffbd3af8914bef4e6297d1160d49
* fix: schema changes for 57bfb37c55a839662144e684875003ab52315ecc and be6bbabd0e2551fbe9571dcf3ee40ad721764543
* fix: schema changes for 6e86b4afa20d662af8b9f1c07518df2d8c258105 and 3efad2e13b7319eb9a1f4fda7af047be43ebc11f and 68f66223e73a72f378f193c83a9b5546bede2cda
* fix: allowing optional qs prop in pagination keys (not sure why this didn't break before)
* fix: re-login on email change
* fix: schema changes for c926358d734a2fa410de87f4e4a91744215fc14a
* fix: schema changes for 388a8270c9882892bad5c8141f65da8d59eac0fd
* fix: schema change for 2658bcc821c22e137a6eeb9bb74098856a642eaf
* fix: no need to call account middlewares for chats routes
* fix: schema changes for 71743affc3e58dc85d4ffa15ce043d4d9ddd3d67
* fix: final schema changes
* test: support for anyOf and oneOf
* fix: check thumb
* dont scroll to top on back press
* remove group log
* fix: add top margin to merged and deleted alerts
* chore: up widgets
* fix: improve fix-lists mixin
* chore: up harmony/composer
* feat: allow hiding quicksearch results during search
* dont record searches made by composer
* chore: up 54
* chore: up spam be gone
* feat: add prev/next page and page count into mobile paginator
* chore: up harmony
* chore: up harmony
* use old style for IS
* fix: hide entire toolbar row if no posts or not singlePost
* fix: updated messaging for post-queue template, #11206
* fix: btn-sm on post queue back button
* fix: bump harmony, closes #11206
* fix: remove unused alert module import
* fix: bump harmony
* fix: bump harmony
* chore: up harmony
* refactor: IS scrolltop
* fix: update users:search-user-for-chat source string
* feat: support for mark-read toggle on chats dropdown and recent chats list
* feat: api v3 calls to mark chat read/unread
* feat: send event:chats.mark socket event on mark read or unread
* refactor: allow frontend to mark chats as unread, use new API v3 routes instead of socket calls, better frontend event handling
* docs: openapi schema updates for chat marking
* fix: allow unread state toggling in chats dropdown too
* fix: issue where repeated openings of the chats dropdown would continually add events for mark-read/unread
* fix: debug log
* refactor: move userSearch filter to a module
* feat(routes): allow remounting /categories (#11230)
* feat: send flags count to frontend on flags list page
* refactor: filter form client-side js to extract out some logic
* fix: applyFilters to not take any arguments, update selectedCids in updateButton instead of onHidden
* fix: use userFilter module for assignee, reporterId, targetUid
* fix(openapi): schema changes for updated flags page
* fix: dont allow adding duplicates to userFilter
* use same var
* remove log
* fix: closes #11282
* feat: lang key for x-topics
* chore: up harmony
* chore: up emoji
* chore: up harmony
* fix: update userFilter to allow new option `selectedBlock`
* fix: wrong block name passed to userFilter
* fix: https://github.com/NodeBB/NodeBB/issues/11283
* fix: chats, allow multiple dropdowns like in harmony
* chore: up harmony
* refactor: flag note adding/editing, closes #11285
* fix: remove old prepareEdit logic
* chore: add caveat about hacky code block in userFilter module
* fix: placeholders for userFilter module
* refactor: navigator so it works with multiple thumbs/navigators
* chore: up harmony
* fix: closes #11287, destroy quick reply autocomplete
on navigation
* fix: filter disabled categories on user categories page count
* chore: up harmony
* docs: update openapi spec to include info about passing in timestamps for topic creation, removing timestamp as valid request param for topic replying
* fix: send back null values on ACP search dashboard for startDate and endDate if not expicitly passed in, fix tests
* fix: tweak table order in ACP dash searches
* fix: only invoke navigator click drag on left mouse button
* feat: add back unread indicator to navigator
* clear bookmark on mark unread
* fix: navigator crash on ajaxify
* better thumb top calculation
* fix: reset user bookmark when topic is marked unread
* Revert "fix: reset user bookmark when topic is marked unread"
This reverts commit 9bcd85c2c6848c3d325d32027261809da6e11c9e.
* fix: update unread indicator on scroll, add unread count
* chore: bump harmony
* fix: crash on navigator unread update when backing out of a topic
* fix: closes #11183
* fix: update topics:recent zset when rescheduling a topic
* fix: dupe quote button, increase delay, hide immediately on empty selection
* fix: navigator not showing up on first load
* refactor: remove glance
assorted fixes to navigator
dont reduce remaning count if user scrolls down and up quickly
only call topic.navigatorCallback when index changes
* more sanity checks for bookmark
dont allow setting bookmark higher than topic postcount
* closes #11218, :train:
* Revert "fix: update topics:recent zset when rescheduling a topic"
This reverts commit 737973cca9e94b6cb3867492a09e1e0b1af391d5.
* fix: #11306, show proper error if queued post doesn't exist
was showing no-privileges if someone else accepted the post
* https://github.com/NodeBB/NodeBB/issues/11307
dont use li
* chore: up harmony
* chore: bump version string
* fix: copy paste fail
* feat: closes #7382, tag filtering
add client side support for filtering by tags on /category, /recent and /unread
* chore: up harmony
* chore: up harmony
* Revert "fix: add back req.query fallback for backwards compatibility" [breaking]
This reverts commit cf6cc2c454dc35c330393c62ee8ce67b42d8eefb.
This commit is no longer required as passing in a CSRF token via query parameter is no longer supported as of NodeBB v3.x
This is a breaking change.
* fix: pass csrf token in form data, re: NodeBB/NodeBB#11309
* chore: up deps
* fix: tests, use x-csrf-token query param removed
* test: fix csrf_token
* lint: remove unused
* feat: add itemprop="image" to avatar helper
* fix: get chat upload button in chat modal
* breaking: remove deprecated socket.io methods
* test: update messaging tests to not use sockets
* fix: parent post links
* fix: prevent post tooltip if mouse leaves before data/tpl is loaded
* chore: up harmony
* chore: up harmony
* chore: up harmony
* chore: up harmony
* fix: nested replies indices
* fix(deps): bump 2factor
* feat: add loggedIn user to all api routes
* chore: up themes
* refactor: audit admin v3 write api routes as per #11321
* refactor: audit category v3 write api routes as per #11321 [breaking]
docs: fix open api spec for #11321
* refactor: audit chat v3 write api routes as per #11321
* refactor: audit files v3 write api routes as per #11321
* refactor: audit flags v3 write api routes as per #11321
* refactor: audit posts v3 write api routes as per #11321
* refactor: audit topics v3 write api routes as per #11321
* refactor: audit users v3 write api routes as per #11321
* fix: lang string
* remove min height
* fix: empty topic/labels taking up space
* fix: tag filtering when changing filter to watched topics
or changing popular time limit to month
* chore: up harmony
* fix: closes #11354, show no post error if queued post already accepted/rejected
* test: #11354
* test: #11354
* fix(deps): bump 2factor
* fix: #11357 clear cache on thumb remove
* fix: thumb remove on windows, closes #11357
* test: openapi for thumbs
* test: fix openapi
---------
Co-authored-by: Julian Lam <julian@nodebb.org>
Co-authored-by: Opliko <opliko.reg@protonmail.com>
											 
										 
										
											2023-03-17 11:58:31 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  adminUid  =  await  user . create ( {  username :  'admin' ,  password :  '123456'  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										const  unprivUid  =  await  user . create ( {  username :  'unpriv' ,  password :  '123456'  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										const  emailConfirmationUid  =  await  user . create ( {  username :  'emailConf' ,  email :  'emailConf@example.org'  } ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-03 13:02:21 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										await  user . setUserField ( adminUid ,  'email' ,  'test@example.org' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										await  user . setUserField ( unprivUid ,  'email' ,  'unpriv@example.org' ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-28 15:07:19 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										await  user . email . confirmByUid ( adminUid ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										await  user . email . confirmByUid ( unprivUid ) ; 
							 
						 
					
						
							
								
									
										
											 
										
											
												Bootstrap5 (#10894)
* chore: up deps
* chore: up composer
* fix(deps): bump 2factor to v7
* chore: up harmony
* chore: up harmony
* fix: missing await
* feat: allow middlewares to pass in template values via res.locals
* feat: buildAccountData middleware automatically added ot all account routes
* fix: properly allow values in res.locals.templateValues to be added to the template data
* refactor: user/blocks
* refactor(accounts): categories and consent
* feat: automatically 404 if exposeUid or exposeGroupName come up empty
* refactor: remove calls to getUserDataByUserSlug for most account routes, since it is populated via middleware now
* fix: allow exposeUid and exposeGroupName to work with slugs with mixed capitalization
* fix: move reputation removal check to accountHelpers method
* test: skip i18n tests if ref branch when present is not develop
* fix(deps): bump theme versions
* fix(deps): bump ntfy and 2factor
* chore: up harmony
* fix: add missing return
* fix: #11191, only focus on search input on md environments and up
* feat: allow file uploads on mobile chat
closes https://github.com/NodeBB/NodeBB/issues/11217
* chore: up themes
* chore: add lang string
* fix(deps): bump ntfy to 1.0.15
* refactor: use new if/each syntax
* chore: up composer
* fix: regression from user helper refactor
* chore: up harmony
* chore: up composer
* chore: up harmony
* chore: up harmony
* chore: up harmony
* chore: fix composer version
* feat: add increment helper
* chore: up harmony
* fix: #11228 no timestamps in future :hourglass:
* chore: up harmony
* check config.theme as well
fire action:posts.loaded after processing dom
* chore: up harmony
* chore: up harmony
* chore: up harmony
* chore: up themes
* chore: up harmony
* remove extra class
* refactor: move these to core from harmony
* chore: up widgets
* chore: up widgets
* height auto
* fix: closes #11238
* dont focus inputs, annoying on mobile
* fix: dont focus twice, only focus on chat input on desktop
dont wrap widget footer in row
* chore: up harmony
* chore: up harmony
* update chat window
* chore: up themes
* fix cache buster for skins
* chat fixes
* chore: up harmony
* chore: up composer
* refactor: change hook logs to debug
* fix: scroll to post right after adding to dom
* fix: hash scrolling and highlighting correct post
* test: re-enable read API schema tests
* fix: add back schema changes for 179faa2270f2ad955dcc4a7b04755acce59e6ffd and c3920ccb10d8ead2dcd9914bb1784bed3f6adfd4
* fix: schema changes from 488f0978a4aa1ca1e4d2a1f2e8c7ef7a681f2f27
* fix: schema changes for f4cf482a874701ce80c0f306c49d8788cec66f87
* fix: schema update for be6bbabd0e2551fbe9571dcf3ee40ad721764543
* fix: schema changes for 69c96078ea78ee2c45885a90a6f6a59f9042a33c
* fix: schema changes for d1364c313021e48a879a818b24947e1457c062f7
* fix: schema changes for 84ff1152f7552dd866e25a90972d970b9861107e
* fix: schema changes for b860c2605c209e0650ef98f4c80d842ea23a51ce
* fix: schema changes for 23cb67a1126481848fac39aafd1e253441e76d7f
* fix: schema changes for b916e42f400dac8aa51670b15e439f87f0eb8939
* fix: schema change for a9bbb586fcb3a1c61b5fb69052236e78cdf7d743
* fix: schema changes for 4b738c8cd36c936a1dbe2bb900c694bf6c5520ec
* fix: schema changes for 58b5781cea9acb129e6604a82ab5a5bfc0d8394d
* fix: schema changes for 794bf01b21709c4be06584d576d706b3d6342057
* fix: schema changes for 80ea12c1c1963f5b39fb64841e4f3c8da3c87af2, e368feef51e0766f119c9710fb4db8f64724725c, and 52ead114bec961c62fa2eb0786540e229f6e4873
* fix: composer-default object in config?
* fix: schema changes for 9acdc6808c070555352951c651921df181b10993 and 093093420027999df3c67bf0ea6024f6dbf81d2d
* fix: schema changes for c0a52924f1f7ef8caeaacda67363ac269b56042c
* fix: schema change for aba420a3f3b774e949c2539c73f3dc0e1ae79a38, move loggedInUser to optional props
* fix: schema changes for 8c67031609da30d788561459f8bb76e9a69253de
* fix: schema changes for 27e53b42f3ce48fa61d3754375715cd41ffe808d
* fix: schema changes for 28359665187b0a3b9ec6226dca1234ebdbd725a5
* fix: breaking test for email confirmation API call
* fix: schema changes for refactored search page
* fix: schema changes for user object
* fix: schema changes for 9f531f957e08eabb4bae844ddd67bde14d9b59f0
* fix: schema changes for c4042c70decd628e5b880bd109515b47e4e16164 and 23175110a29640e6fa052db1079bfedb34a61055
* fix: schema changes for 9b3616b10392e247974eb0c1e6225a1582bf6c69
* fix: schema changes for 5afd5de07d42fd33f039a6f85ded3b4992200e5a
* fix: schema change for 1d7baf12171cffbd3af8914bef4e6297d1160d49
* fix: schema changes for 57bfb37c55a839662144e684875003ab52315ecc and be6bbabd0e2551fbe9571dcf3ee40ad721764543
* fix: schema changes for 6e86b4afa20d662af8b9f1c07518df2d8c258105 and 3efad2e13b7319eb9a1f4fda7af047be43ebc11f and 68f66223e73a72f378f193c83a9b5546bede2cda
* fix: allowing optional qs prop in pagination keys (not sure why this didn't break before)
* fix: re-login on email change
* fix: schema changes for c926358d734a2fa410de87f4e4a91744215fc14a
* fix: schema changes for 388a8270c9882892bad5c8141f65da8d59eac0fd
* fix: schema change for 2658bcc821c22e137a6eeb9bb74098856a642eaf
* fix: no need to call account middlewares for chats routes
* fix: schema changes for 71743affc3e58dc85d4ffa15ce043d4d9ddd3d67
* fix: final schema changes
* test: support for anyOf and oneOf
* fix: check thumb
* dont scroll to top on back press
* remove group log
* fix: add top margin to merged and deleted alerts
* chore: up widgets
* fix: improve fix-lists mixin
* chore: up harmony/composer
* feat: allow hiding quicksearch results during search
* dont record searches made by composer
* chore: up 54
* chore: up spam be gone
* feat: add prev/next page and page count into mobile paginator
* chore: up harmony
* chore: up harmony
* use old style for IS
* fix: hide entire toolbar row if no posts or not singlePost
* fix: updated messaging for post-queue template, #11206
* fix: btn-sm on post queue back button
* fix: bump harmony, closes #11206
* fix: remove unused alert module import
* fix: bump harmony
* fix: bump harmony
* chore: up harmony
* refactor: IS scrolltop
* fix: update users:search-user-for-chat source string
* feat: support for mark-read toggle on chats dropdown and recent chats list
* feat: api v3 calls to mark chat read/unread
* feat: send event:chats.mark socket event on mark read or unread
* refactor: allow frontend to mark chats as unread, use new API v3 routes instead of socket calls, better frontend event handling
* docs: openapi schema updates for chat marking
* fix: allow unread state toggling in chats dropdown too
* fix: issue where repeated openings of the chats dropdown would continually add events for mark-read/unread
* fix: debug log
* refactor: move userSearch filter to a module
* feat(routes): allow remounting /categories (#11230)
* feat: send flags count to frontend on flags list page
* refactor: filter form client-side js to extract out some logic
* fix: applyFilters to not take any arguments, update selectedCids in updateButton instead of onHidden
* fix: use userFilter module for assignee, reporterId, targetUid
* fix(openapi): schema changes for updated flags page
* fix: dont allow adding duplicates to userFilter
* use same var
* remove log
* fix: closes #11282
* feat: lang key for x-topics
* chore: up harmony
* chore: up emoji
* chore: up harmony
* fix: update userFilter to allow new option `selectedBlock`
* fix: wrong block name passed to userFilter
* fix: https://github.com/NodeBB/NodeBB/issues/11283
* fix: chats, allow multiple dropdowns like in harmony
* chore: up harmony
* refactor: flag note adding/editing, closes #11285
* fix: remove old prepareEdit logic
* chore: add caveat about hacky code block in userFilter module
* fix: placeholders for userFilter module
* refactor: navigator so it works with multiple thumbs/navigators
* chore: up harmony
* fix: closes #11287, destroy quick reply autocomplete
on navigation
* fix: filter disabled categories on user categories page count
* chore: up harmony
* docs: update openapi spec to include info about passing in timestamps for topic creation, removing timestamp as valid request param for topic replying
* fix: send back null values on ACP search dashboard for startDate and endDate if not expicitly passed in, fix tests
* fix: tweak table order in ACP dash searches
* fix: only invoke navigator click drag on left mouse button
* feat: add back unread indicator to navigator
* clear bookmark on mark unread
* fix: navigator crash on ajaxify
* better thumb top calculation
* fix: reset user bookmark when topic is marked unread
* Revert "fix: reset user bookmark when topic is marked unread"
This reverts commit 9bcd85c2c6848c3d325d32027261809da6e11c9e.
* fix: update unread indicator on scroll, add unread count
* chore: bump harmony
* fix: crash on navigator unread update when backing out of a topic
* fix: closes #11183
* fix: update topics:recent zset when rescheduling a topic
* fix: dupe quote button, increase delay, hide immediately on empty selection
* fix: navigator not showing up on first load
* refactor: remove glance
assorted fixes to navigator
dont reduce remaning count if user scrolls down and up quickly
only call topic.navigatorCallback when index changes
* more sanity checks for bookmark
dont allow setting bookmark higher than topic postcount
* closes #11218, :train:
* Revert "fix: update topics:recent zset when rescheduling a topic"
This reverts commit 737973cca9e94b6cb3867492a09e1e0b1af391d5.
* fix: #11306, show proper error if queued post doesn't exist
was showing no-privileges if someone else accepted the post
* https://github.com/NodeBB/NodeBB/issues/11307
dont use li
* chore: up harmony
* chore: bump version string
* fix: copy paste fail
* feat: closes #7382, tag filtering
add client side support for filtering by tags on /category, /recent and /unread
* chore: up harmony
* chore: up harmony
* Revert "fix: add back req.query fallback for backwards compatibility" [breaking]
This reverts commit cf6cc2c454dc35c330393c62ee8ce67b42d8eefb.
This commit is no longer required as passing in a CSRF token via query parameter is no longer supported as of NodeBB v3.x
This is a breaking change.
* fix: pass csrf token in form data, re: NodeBB/NodeBB#11309
* chore: up deps
* fix: tests, use x-csrf-token query param removed
* test: fix csrf_token
* lint: remove unused
* feat: add itemprop="image" to avatar helper
* fix: get chat upload button in chat modal
* breaking: remove deprecated socket.io methods
* test: update messaging tests to not use sockets
* fix: parent post links
* fix: prevent post tooltip if mouse leaves before data/tpl is loaded
* chore: up harmony
* chore: up harmony
* chore: up harmony
* chore: up harmony
* fix: nested replies indices
* fix(deps): bump 2factor
* feat: add loggedIn user to all api routes
* chore: up themes
* refactor: audit admin v3 write api routes as per #11321
* refactor: audit category v3 write api routes as per #11321 [breaking]
docs: fix open api spec for #11321
* refactor: audit chat v3 write api routes as per #11321
* refactor: audit files v3 write api routes as per #11321
* refactor: audit flags v3 write api routes as per #11321
* refactor: audit posts v3 write api routes as per #11321
* refactor: audit topics v3 write api routes as per #11321
* refactor: audit users v3 write api routes as per #11321
* fix: lang string
* remove min height
* fix: empty topic/labels taking up space
* fix: tag filtering when changing filter to watched topics
or changing popular time limit to month
* chore: up harmony
* fix: closes #11354, show no post error if queued post already accepted/rejected
* test: #11354
* test: #11354
* fix(deps): bump 2factor
* fix: #11357 clear cache on thumb remove
* fix: thumb remove on windows, closes #11357
* test: openapi for thumbs
* test: fix openapi
---------
Co-authored-by: Julian Lam <julian@nodebb.org>
Co-authored-by: Opliko <opliko.reg@protonmail.com>
											 
										 
										
											2023-03-17 11:58:31 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										mocks . get [ '/api/confirm/{code}' ] [ 0 ] . example  =  await  db . get ( ` confirm:byUid: ${ emailConfirmationUid } ` ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-28 15:07:19 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-17 17:29:50 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( let  x  =  0 ;  x  <  4 ;  x ++ )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-26 21:51:25 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// eslint-disable-next-line no-await-in-loop
 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-18 16:42:18 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											await  user . create ( {  username :  'deleteme' ,  password :  '123456'  } ) ;  // for testing of DELETE /users (uids 5, 6) and DELETE /user/:uid/account (uid 7)
 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-26 21:51:25 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-23 21:50:08 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										await  groups . join ( 'administrators' ,  adminUid ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-05-10 15:16:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Create api token for testing read/updating/deletion
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										const  token  =  await  api . utils . tokens . generate ( {  uid :  adminUid  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										mocks . get [ '/admin/tokens/{token}' ] [ 0 ] . example  =  token ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										mocks . put [ '/admin/tokens/{token}' ] [ 0 ] . example  =  token ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										mocks . delete [ '/admin/tokens/{token}' ] [ 0 ] . example  =  token ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Create another token for testing rolling
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										const  token2  =  await  api . utils . tokens . generate ( {  uid :  adminUid  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										mocks . post [ '/admin/tokens/{token}/roll' ] [ 0 ] . example  =  token2 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-10-26 21:51:25 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Create sample group
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										await  groups . create ( { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											name :  'Test Group' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-03-31 12:24:26 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Create private groups for pending/invitations
 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-31 15:37:13 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  [ pending1 ,  pending2 ,  inviteUid ]  =  await  Promise . all ( [ 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-31 12:24:26 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											await  user . create ( {  username :  utils . generateUUID ( ) . slice ( 0 ,  8 )  } ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											await  user . create ( {  username :  utils . generateUUID ( ) . slice ( 0 ,  8 )  } ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											await  user . create ( {  username :  utils . generateUUID ( ) . slice ( 0 ,  8 )  } ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										mocks . put [ '/groups/{slug}/pending/{uid}' ] [ 1 ] . example  =  pending1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										mocks . delete [ '/groups/{slug}/pending/{uid}' ] [ 1 ] . example  =  pending2 ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-31 15:37:13 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										mocks . delete [ '/groups/{slug}/invites/{uid}' ] [ 1 ] . example  =  inviteUid ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-31 12:24:26 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										await  Promise . all ( [ 'private-group' ,  'invitations-only' ] . map ( async  ( name )  =>  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											await  groups . create ( {  name ,  private :  true  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										await  groups . requestMembership ( 'private-group' ,  pending1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										await  groups . requestMembership ( 'private-group' ,  pending2 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-31 15:37:13 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										await  groups . invite ( 'invitations-only' ,  inviteUid ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-31 12:24:26 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-10-26 21:51:25 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										await  meta . settings . set ( 'core.api' ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											tokens :  [ { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												token :  mocks . delete [ '/users/{uid}/tokens/{token}' ] [ 1 ] . example , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												uid :  1 , 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-12 15:52:33 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												description :  'for testing of token deletion route' , 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-26 21:51:25 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												timestamp :  Date . now ( ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-04 12:56:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										meta . config . allowTopicsThumbnail  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-29 10:31:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										meta . config . termsOfUse  =  'I, for one, welcome our new test-driven overlords' ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-14 11:01:05 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										meta . config . chatMessageDelay  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-20 15:01:38 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										meta . config . activitypubEnabled  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-26 21:51:25 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-04-23 21:50:08 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Create a category
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										const  testCategory  =  await  categories . create ( {  name :  'test'  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Post a new topic
 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-03 12:34:13 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										await  topics . post ( { 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-23 21:50:08 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											uid :  adminUid , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											cid :  testCategory . cid , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											title :  'Test Topic' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											content :  'Test topic content' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-27 11:02:20 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  unprivTopic  =  await  topics . post ( { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											uid :  unprivUid , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											cid :  testCategory . cid , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											title :  'Test Topic 2' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											content :  'Test topic 2 content' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-18 15:31:14 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										await  topics . post ( { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											uid :  unprivUid , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											cid :  testCategory . cid , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											title :  'Test Topic 3' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											content :  'Test topic 3 content' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-23 21:50:08 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-02-03 12:34:13 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Create a post diff
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										await  posts . edit ( { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											uid :  adminUid , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											pid :  unprivTopic . postData . pid , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											content :  'Test topic 2 edited content' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											req :  { } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										mocks . delete [ '/posts/{pid}/diffs/{timestamp}' ] [ 0 ] . example  =  unprivTopic . postData . pid ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										mocks . delete [ '/posts/{pid}/diffs/{timestamp}' ] [ 1 ] . example  =  ( await  posts . diffs . list ( unprivTopic . postData . pid ) ) [ 0 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-04-23 21:50:08 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Create a sample flag
 
							 
						 
					
						
							
								
									
										
											 
										
											
												Webpack5 (#10311)
* feat: webpack 5 part 1
* fix: gruntfile fixes
* fix: fix taskbar warning
add app.importScript
copy public/src/modules to build folder
* refactor: remove commented old code
* feat: reenable admin
* fix: acp settings pages, fix sortable on manage categories
embedded require in html not allowed
* fix: bundle serialize/deserizeli so plugins dont break
* test: fixe util tests
* test: fix require path
* test: more test fixes
* test: require correct utils module
* test: require correct utils
* test: log stack
* test: fix db require blowing up tests
* test: move and disable bundle test
* refactor: add aliases
* test: disable testing route
* fix: move webpack modules necessary for build, into `dependencies`
* test: fix one more test
remove 500-embed.tpl
* fix: restore use of assets/nodebb.min.js, at least for now
* fix: remove unnecessary line break
* fix: point to proper ACP bundle
* test: maybe fix build test
* test: composer
* refactor: dont need dist
* refactor: more cleanup
use everything from build/public folder
* get rid of conditional import in app.js
* fix: ace
* refactor: cropper alias
* test: lint and test fixes
* lint: fix
* refactor: rename function to app.require
* refactor: go back to using app.require
* chore: use github branch
* chore: use webpack branch
* feat: webpack webinstaller
* feat: add chunkFile name with contenthash
* refactor: move hooks to top
* refactor: get rid of template500Function
* fix(deps): use webpack5 branch of 2factor plugin
* chore: tagging v2.0.0-beta.0 pre-release version :boom: :shipit: :tada: :rocket:
* refactor: disable cache on templates
loadTemplate is called once by benchpress and the result is cache internally
* refactor: add server side helpers.js
* feat: deprecate /plugins shorthand route, closes #10343
* refactor: use build/public for webpack
* test: fix filename
* fix: more specific selector
* lint: ignore
* refactor: fix comments
* test: add debug for random failing test
* refactor: cleanup
remove test page, remove dupe functions in utils.common
* lint: use relative path  for now
* chore: bump prerelease version
* feat: add translateKeys
* fix: optional params
* fix: get rid of extra timeago files
* refactor: cleanup, require timeago locale earlier
remove translator.prepareDOM, it is in header.tpl html tag
* refactor: privileges system to use a Map in the backend instead of separate objects for keys and labels (#10378)
* refactor: privileges system to use a Map in the backend instead of separate objects for keys and labels
- Existing hooks are preserved (to be deprecated at a later date, possibly)
- New init hooks are called on NodeBB start, and provide a one-stop shop to add new privileges, instead of having to add to four different hooks
* docs: fix typo in comment
* test: spec changes
* refactor: privileges system to use a Map in the backend instead of separate objects for keys and labels (#10378)
* refactor: privileges system to use a Map in the backend instead of separate objects for keys and labels
- Existing hooks are preserved (to be deprecated at a later date, possibly)
- New init hooks are called on NodeBB start, and provide a one-stop shop to add new privileges, instead of having to add to four different hooks
* docs: fix typo in comment
* test: spec changes
* feat: allow app.require('bootbox'/'benchpressjs')
* refactor: require server side utils
* test: jquery ready
* change istaller to use build/public
* test: use document.addEventListener
* refactor: closes #10301
* refactor: generateTopicClass
* fix: column counts for other privileges
* fix: #10443, regression where sorted-list items did not render into the DOM in the predicted order [breaking]
* fix: typo in hook name
* refactor: introduce a generic autocomplete.init() method that can be called to add nodebb-style autocompletion but using different data sources (e.g. not user/groups/tags)
* fix: crash if `delay` not passed in (as it cannot be destructured)
* refactor: replace substr
* feat: set --panel-offset style in html element based on stored value in localStorage
* refactor: addDropupHandler() logic to be less naive
- Take into account height of the menu
- Don't apply dropUp logic if there's nothing in the dropdown
- Remove 'hidden' class (added by default in Persona for post tools) when menu items are added
closes #10423
* refactor: simplify utils.params [breaking]
Retrospective analysis of the usage of this method suggests that the options passed in are superfluous, and that only `url` is required. Using a browser built-in makes more sense to accomplish what this method sets out to do.
* feat: add support for returning full URLSearchParams for utils.params
* fix: utils.params() fallback handling
* fix: default empty obj for params()
* fix: remove \'loggedin\' and \'register\' qs parameters once they have been used, delay invocation of messages until ajaxify.end
* fix: utils.params() not allowing relative paths to be passed in
* refactor(DRY): new assertPasswordValidity utils method
* fix: incorrect error message returned on insufficient privilege on flag edit
* fix: read/update/delete access to flags API should be limited for moderators to only post flags in categories they moderate
- added failing tests and patched up middleware.assert.flags to fix
* refactor: flag api v3 tests to create new post and flags on every round
* fix: missing error:no-flag language key
* refactor: flags.canView to check flag existence, simplify middleware.assert.flag
* feat: flag deletion API endpoint, #10426
* feat: UI for flag deletion, closes #10426
* chore: update plugin versions
* chore: up emoji
* chore: update markdown
* chore: up emoji-android
* fix: regression caused by utils.params() refactor, supports arrays and pipes all values through utils.toType, adjusts tests to type check
Co-authored-by: Julian Lam <julian@nodebb.org>
											 
										 
										
											2022-04-29 21:39:33 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  {  flagId  }  =  await  flags . create ( 'post' ,  1 ,  unprivUid ,  'sample reasons' ,  Date . now ( ) ) ;  // deleted in DELETE /api/v3/flags/1
 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-16 13:44:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										await  flags . appendNote ( flagId ,  1 ,  'test note' ,  1626446956652 ) ; 
							 
						 
					
						
							
								
									
										
											 
										
											
												Webpack5 (#10311)
* feat: webpack 5 part 1
* fix: gruntfile fixes
* fix: fix taskbar warning
add app.importScript
copy public/src/modules to build folder
* refactor: remove commented old code
* feat: reenable admin
* fix: acp settings pages, fix sortable on manage categories
embedded require in html not allowed
* fix: bundle serialize/deserizeli so plugins dont break
* test: fixe util tests
* test: fix require path
* test: more test fixes
* test: require correct utils module
* test: require correct utils
* test: log stack
* test: fix db require blowing up tests
* test: move and disable bundle test
* refactor: add aliases
* test: disable testing route
* fix: move webpack modules necessary for build, into `dependencies`
* test: fix one more test
remove 500-embed.tpl
* fix: restore use of assets/nodebb.min.js, at least for now
* fix: remove unnecessary line break
* fix: point to proper ACP bundle
* test: maybe fix build test
* test: composer
* refactor: dont need dist
* refactor: more cleanup
use everything from build/public folder
* get rid of conditional import in app.js
* fix: ace
* refactor: cropper alias
* test: lint and test fixes
* lint: fix
* refactor: rename function to app.require
* refactor: go back to using app.require
* chore: use github branch
* chore: use webpack branch
* feat: webpack webinstaller
* feat: add chunkFile name with contenthash
* refactor: move hooks to top
* refactor: get rid of template500Function
* fix(deps): use webpack5 branch of 2factor plugin
* chore: tagging v2.0.0-beta.0 pre-release version :boom: :shipit: :tada: :rocket:
* refactor: disable cache on templates
loadTemplate is called once by benchpress and the result is cache internally
* refactor: add server side helpers.js
* feat: deprecate /plugins shorthand route, closes #10343
* refactor: use build/public for webpack
* test: fix filename
* fix: more specific selector
* lint: ignore
* refactor: fix comments
* test: add debug for random failing test
* refactor: cleanup
remove test page, remove dupe functions in utils.common
* lint: use relative path  for now
* chore: bump prerelease version
* feat: add translateKeys
* fix: optional params
* fix: get rid of extra timeago files
* refactor: cleanup, require timeago locale earlier
remove translator.prepareDOM, it is in header.tpl html tag
* refactor: privileges system to use a Map in the backend instead of separate objects for keys and labels (#10378)
* refactor: privileges system to use a Map in the backend instead of separate objects for keys and labels
- Existing hooks are preserved (to be deprecated at a later date, possibly)
- New init hooks are called on NodeBB start, and provide a one-stop shop to add new privileges, instead of having to add to four different hooks
* docs: fix typo in comment
* test: spec changes
* refactor: privileges system to use a Map in the backend instead of separate objects for keys and labels (#10378)
* refactor: privileges system to use a Map in the backend instead of separate objects for keys and labels
- Existing hooks are preserved (to be deprecated at a later date, possibly)
- New init hooks are called on NodeBB start, and provide a one-stop shop to add new privileges, instead of having to add to four different hooks
* docs: fix typo in comment
* test: spec changes
* feat: allow app.require('bootbox'/'benchpressjs')
* refactor: require server side utils
* test: jquery ready
* change istaller to use build/public
* test: use document.addEventListener
* refactor: closes #10301
* refactor: generateTopicClass
* fix: column counts for other privileges
* fix: #10443, regression where sorted-list items did not render into the DOM in the predicted order [breaking]
* fix: typo in hook name
* refactor: introduce a generic autocomplete.init() method that can be called to add nodebb-style autocompletion but using different data sources (e.g. not user/groups/tags)
* fix: crash if `delay` not passed in (as it cannot be destructured)
* refactor: replace substr
* feat: set --panel-offset style in html element based on stored value in localStorage
* refactor: addDropupHandler() logic to be less naive
- Take into account height of the menu
- Don't apply dropUp logic if there's nothing in the dropdown
- Remove 'hidden' class (added by default in Persona for post tools) when menu items are added
closes #10423
* refactor: simplify utils.params [breaking]
Retrospective analysis of the usage of this method suggests that the options passed in are superfluous, and that only `url` is required. Using a browser built-in makes more sense to accomplish what this method sets out to do.
* feat: add support for returning full URLSearchParams for utils.params
* fix: utils.params() fallback handling
* fix: default empty obj for params()
* fix: remove \'loggedin\' and \'register\' qs parameters once they have been used, delay invocation of messages until ajaxify.end
* fix: utils.params() not allowing relative paths to be passed in
* refactor(DRY): new assertPasswordValidity utils method
* fix: incorrect error message returned on insufficient privilege on flag edit
* fix: read/update/delete access to flags API should be limited for moderators to only post flags in categories they moderate
- added failing tests and patched up middleware.assert.flags to fix
* refactor: flag api v3 tests to create new post and flags on every round
* fix: missing error:no-flag language key
* refactor: flags.canView to check flag existence, simplify middleware.assert.flag
* feat: flag deletion API endpoint, #10426
* feat: UI for flag deletion, closes #10426
* chore: update plugin versions
* chore: up emoji
* chore: update markdown
* chore: up emoji-android
* fix: regression caused by utils.params() refactor, supports arrays and pipes all values through utils.toType, adjusts tests to type check
Co-authored-by: Julian Lam <julian@nodebb.org>
											 
										 
										
											2022-04-29 21:39:33 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										await  flags . create ( 'post' ,  2 ,  unprivUid ,  'sample reasons' ,  Date . now ( ) ) ;  // for testing flag notes (since flag 1 deleted)
 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-23 21:50:08 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2025-06-27 15:13:16 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Create a new chat room & send a message
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										const  roomId  =  await  messaging . newRoom ( adminUid ,  {  uids :  [ unprivUid ]  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										await  messaging . sendMessage ( { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											roomId , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											uid :  adminUid , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											content :  'this is a chat message' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-23 21:50:08 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-12-04 12:56:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Create an empty file to test DELETE /files and thumb deletion
 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-27 11:02:20 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										fs . closeSync ( fs . openSync ( path . resolve ( nconf . get ( 'upload_path' ) ,  'files/test.txt' ) ,  'w' ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-04 12:56:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										fs . closeSync ( fs . openSync ( path . resolve ( nconf . get ( 'upload_path' ) ,  'files/test.png' ) ,  'w' ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-27 11:02:20 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-02-16 12:18:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Associate thumb with topic to test thumb reordering
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										await  topics . thumbs . associate ( { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											id :  2 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											path :  'files/test.png' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-27 16:15:01 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  socketAdmin  =  require ( '../src/socket.io/admin' ) ; 
							 
						 
					
						
							
								
									
										
											 
										
											
												Bootstrap5 (#10894)
* chore: up deps
* chore: up composer
* fix(deps): bump 2factor to v7
* chore: up harmony
* chore: up harmony
* fix: missing await
* feat: allow middlewares to pass in template values via res.locals
* feat: buildAccountData middleware automatically added ot all account routes
* fix: properly allow values in res.locals.templateValues to be added to the template data
* refactor: user/blocks
* refactor(accounts): categories and consent
* feat: automatically 404 if exposeUid or exposeGroupName come up empty
* refactor: remove calls to getUserDataByUserSlug for most account routes, since it is populated via middleware now
* fix: allow exposeUid and exposeGroupName to work with slugs with mixed capitalization
* fix: move reputation removal check to accountHelpers method
* test: skip i18n tests if ref branch when present is not develop
* fix(deps): bump theme versions
* fix(deps): bump ntfy and 2factor
* chore: up harmony
* fix: add missing return
* fix: #11191, only focus on search input on md environments and up
* feat: allow file uploads on mobile chat
closes https://github.com/NodeBB/NodeBB/issues/11217
* chore: up themes
* chore: add lang string
* fix(deps): bump ntfy to 1.0.15
* refactor: use new if/each syntax
* chore: up composer
* fix: regression from user helper refactor
* chore: up harmony
* chore: up composer
* chore: up harmony
* chore: up harmony
* chore: up harmony
* chore: fix composer version
* feat: add increment helper
* chore: up harmony
* fix: #11228 no timestamps in future :hourglass:
* chore: up harmony
* check config.theme as well
fire action:posts.loaded after processing dom
* chore: up harmony
* chore: up harmony
* chore: up harmony
* chore: up themes
* chore: up harmony
* remove extra class
* refactor: move these to core from harmony
* chore: up widgets
* chore: up widgets
* height auto
* fix: closes #11238
* dont focus inputs, annoying on mobile
* fix: dont focus twice, only focus on chat input on desktop
dont wrap widget footer in row
* chore: up harmony
* chore: up harmony
* update chat window
* chore: up themes
* fix cache buster for skins
* chat fixes
* chore: up harmony
* chore: up composer
* refactor: change hook logs to debug
* fix: scroll to post right after adding to dom
* fix: hash scrolling and highlighting correct post
* test: re-enable read API schema tests
* fix: add back schema changes for 179faa2270f2ad955dcc4a7b04755acce59e6ffd and c3920ccb10d8ead2dcd9914bb1784bed3f6adfd4
* fix: schema changes from 488f0978a4aa1ca1e4d2a1f2e8c7ef7a681f2f27
* fix: schema changes for f4cf482a874701ce80c0f306c49d8788cec66f87
* fix: schema update for be6bbabd0e2551fbe9571dcf3ee40ad721764543
* fix: schema changes for 69c96078ea78ee2c45885a90a6f6a59f9042a33c
* fix: schema changes for d1364c313021e48a879a818b24947e1457c062f7
* fix: schema changes for 84ff1152f7552dd866e25a90972d970b9861107e
* fix: schema changes for b860c2605c209e0650ef98f4c80d842ea23a51ce
* fix: schema changes for 23cb67a1126481848fac39aafd1e253441e76d7f
* fix: schema changes for b916e42f400dac8aa51670b15e439f87f0eb8939
* fix: schema change for a9bbb586fcb3a1c61b5fb69052236e78cdf7d743
* fix: schema changes for 4b738c8cd36c936a1dbe2bb900c694bf6c5520ec
* fix: schema changes for 58b5781cea9acb129e6604a82ab5a5bfc0d8394d
* fix: schema changes for 794bf01b21709c4be06584d576d706b3d6342057
* fix: schema changes for 80ea12c1c1963f5b39fb64841e4f3c8da3c87af2, e368feef51e0766f119c9710fb4db8f64724725c, and 52ead114bec961c62fa2eb0786540e229f6e4873
* fix: composer-default object in config?
* fix: schema changes for 9acdc6808c070555352951c651921df181b10993 and 093093420027999df3c67bf0ea6024f6dbf81d2d
* fix: schema changes for c0a52924f1f7ef8caeaacda67363ac269b56042c
* fix: schema change for aba420a3f3b774e949c2539c73f3dc0e1ae79a38, move loggedInUser to optional props
* fix: schema changes for 8c67031609da30d788561459f8bb76e9a69253de
* fix: schema changes for 27e53b42f3ce48fa61d3754375715cd41ffe808d
* fix: schema changes for 28359665187b0a3b9ec6226dca1234ebdbd725a5
* fix: breaking test for email confirmation API call
* fix: schema changes for refactored search page
* fix: schema changes for user object
* fix: schema changes for 9f531f957e08eabb4bae844ddd67bde14d9b59f0
* fix: schema changes for c4042c70decd628e5b880bd109515b47e4e16164 and 23175110a29640e6fa052db1079bfedb34a61055
* fix: schema changes for 9b3616b10392e247974eb0c1e6225a1582bf6c69
* fix: schema changes for 5afd5de07d42fd33f039a6f85ded3b4992200e5a
* fix: schema change for 1d7baf12171cffbd3af8914bef4e6297d1160d49
* fix: schema changes for 57bfb37c55a839662144e684875003ab52315ecc and be6bbabd0e2551fbe9571dcf3ee40ad721764543
* fix: schema changes for 6e86b4afa20d662af8b9f1c07518df2d8c258105 and 3efad2e13b7319eb9a1f4fda7af047be43ebc11f and 68f66223e73a72f378f193c83a9b5546bede2cda
* fix: allowing optional qs prop in pagination keys (not sure why this didn't break before)
* fix: re-login on email change
* fix: schema changes for c926358d734a2fa410de87f4e4a91744215fc14a
* fix: schema changes for 388a8270c9882892bad5c8141f65da8d59eac0fd
* fix: schema change for 2658bcc821c22e137a6eeb9bb74098856a642eaf
* fix: no need to call account middlewares for chats routes
* fix: schema changes for 71743affc3e58dc85d4ffa15ce043d4d9ddd3d67
* fix: final schema changes
* test: support for anyOf and oneOf
* fix: check thumb
* dont scroll to top on back press
* remove group log
* fix: add top margin to merged and deleted alerts
* chore: up widgets
* fix: improve fix-lists mixin
* chore: up harmony/composer
* feat: allow hiding quicksearch results during search
* dont record searches made by composer
* chore: up 54
* chore: up spam be gone
* feat: add prev/next page and page count into mobile paginator
* chore: up harmony
* chore: up harmony
* use old style for IS
* fix: hide entire toolbar row if no posts or not singlePost
* fix: updated messaging for post-queue template, #11206
* fix: btn-sm on post queue back button
* fix: bump harmony, closes #11206
* fix: remove unused alert module import
* fix: bump harmony
* fix: bump harmony
* chore: up harmony
* refactor: IS scrolltop
* fix: update users:search-user-for-chat source string
* feat: support for mark-read toggle on chats dropdown and recent chats list
* feat: api v3 calls to mark chat read/unread
* feat: send event:chats.mark socket event on mark read or unread
* refactor: allow frontend to mark chats as unread, use new API v3 routes instead of socket calls, better frontend event handling
* docs: openapi schema updates for chat marking
* fix: allow unread state toggling in chats dropdown too
* fix: issue where repeated openings of the chats dropdown would continually add events for mark-read/unread
* fix: debug log
* refactor: move userSearch filter to a module
* feat(routes): allow remounting /categories (#11230)
* feat: send flags count to frontend on flags list page
* refactor: filter form client-side js to extract out some logic
* fix: applyFilters to not take any arguments, update selectedCids in updateButton instead of onHidden
* fix: use userFilter module for assignee, reporterId, targetUid
* fix(openapi): schema changes for updated flags page
* fix: dont allow adding duplicates to userFilter
* use same var
* remove log
* fix: closes #11282
* feat: lang key for x-topics
* chore: up harmony
* chore: up emoji
* chore: up harmony
* fix: update userFilter to allow new option `selectedBlock`
* fix: wrong block name passed to userFilter
* fix: https://github.com/NodeBB/NodeBB/issues/11283
* fix: chats, allow multiple dropdowns like in harmony
* chore: up harmony
* refactor: flag note adding/editing, closes #11285
* fix: remove old prepareEdit logic
* chore: add caveat about hacky code block in userFilter module
* fix: placeholders for userFilter module
* refactor: navigator so it works with multiple thumbs/navigators
* chore: up harmony
* fix: closes #11287, destroy quick reply autocomplete
on navigation
* fix: filter disabled categories on user categories page count
* chore: up harmony
* docs: update openapi spec to include info about passing in timestamps for topic creation, removing timestamp as valid request param for topic replying
* fix: send back null values on ACP search dashboard for startDate and endDate if not expicitly passed in, fix tests
* fix: tweak table order in ACP dash searches
* fix: only invoke navigator click drag on left mouse button
* feat: add back unread indicator to navigator
* clear bookmark on mark unread
* fix: navigator crash on ajaxify
* better thumb top calculation
* fix: reset user bookmark when topic is marked unread
* Revert "fix: reset user bookmark when topic is marked unread"
This reverts commit 9bcd85c2c6848c3d325d32027261809da6e11c9e.
* fix: update unread indicator on scroll, add unread count
* chore: bump harmony
* fix: crash on navigator unread update when backing out of a topic
* fix: closes #11183
* fix: update topics:recent zset when rescheduling a topic
* fix: dupe quote button, increase delay, hide immediately on empty selection
* fix: navigator not showing up on first load
* refactor: remove glance
assorted fixes to navigator
dont reduce remaning count if user scrolls down and up quickly
only call topic.navigatorCallback when index changes
* more sanity checks for bookmark
dont allow setting bookmark higher than topic postcount
* closes #11218, :train:
* Revert "fix: update topics:recent zset when rescheduling a topic"
This reverts commit 737973cca9e94b6cb3867492a09e1e0b1af391d5.
* fix: #11306, show proper error if queued post doesn't exist
was showing no-privileges if someone else accepted the post
* https://github.com/NodeBB/NodeBB/issues/11307
dont use li
* chore: up harmony
* chore: bump version string
* fix: copy paste fail
* feat: closes #7382, tag filtering
add client side support for filtering by tags on /category, /recent and /unread
* chore: up harmony
* chore: up harmony
* Revert "fix: add back req.query fallback for backwards compatibility" [breaking]
This reverts commit cf6cc2c454dc35c330393c62ee8ce67b42d8eefb.
This commit is no longer required as passing in a CSRF token via query parameter is no longer supported as of NodeBB v3.x
This is a breaking change.
* fix: pass csrf token in form data, re: NodeBB/NodeBB#11309
* chore: up deps
* fix: tests, use x-csrf-token query param removed
* test: fix csrf_token
* lint: remove unused
* feat: add itemprop="image" to avatar helper
* fix: get chat upload button in chat modal
* breaking: remove deprecated socket.io methods
* test: update messaging tests to not use sockets
* fix: parent post links
* fix: prevent post tooltip if mouse leaves before data/tpl is loaded
* chore: up harmony
* chore: up harmony
* chore: up harmony
* chore: up harmony
* fix: nested replies indices
* fix(deps): bump 2factor
* feat: add loggedIn user to all api routes
* chore: up themes
* refactor: audit admin v3 write api routes as per #11321
* refactor: audit category v3 write api routes as per #11321 [breaking]
docs: fix open api spec for #11321
* refactor: audit chat v3 write api routes as per #11321
* refactor: audit files v3 write api routes as per #11321
* refactor: audit flags v3 write api routes as per #11321
* refactor: audit posts v3 write api routes as per #11321
* refactor: audit topics v3 write api routes as per #11321
* refactor: audit users v3 write api routes as per #11321
* fix: lang string
* remove min height
* fix: empty topic/labels taking up space
* fix: tag filtering when changing filter to watched topics
or changing popular time limit to month
* chore: up harmony
* fix: closes #11354, show no post error if queued post already accepted/rejected
* test: #11354
* test: #11354
* fix(deps): bump 2factor
* fix: #11357 clear cache on thumb remove
* fix: thumb remove on windows, closes #11357
* test: openapi for thumbs
* test: fix openapi
---------
Co-authored-by: Julian Lam <julian@nodebb.org>
Co-authored-by: Opliko <opliko.reg@protonmail.com>
											 
										 
										
											2023-03-17 11:58:31 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										await  Promise . all ( [ 'profile' ,  'posts' ,  'uploads' ] . map ( async  type  =>  api . users . generateExport ( {  uid :  adminUid  } ,  {  uid :  adminUid ,  type  } ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-27 16:15:01 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										await  socketAdmin . user . exportUsersCSV ( {  uid :  adminUid  } ,  { } ) ; 
							 
						 
					
						
							
								
									
										
											 
										
											
												Bootstrap5 (#10894)
* chore: up deps
* chore: up composer
* fix(deps): bump 2factor to v7
* chore: up harmony
* chore: up harmony
* fix: missing await
* feat: allow middlewares to pass in template values via res.locals
* feat: buildAccountData middleware automatically added ot all account routes
* fix: properly allow values in res.locals.templateValues to be added to the template data
* refactor: user/blocks
* refactor(accounts): categories and consent
* feat: automatically 404 if exposeUid or exposeGroupName come up empty
* refactor: remove calls to getUserDataByUserSlug for most account routes, since it is populated via middleware now
* fix: allow exposeUid and exposeGroupName to work with slugs with mixed capitalization
* fix: move reputation removal check to accountHelpers method
* test: skip i18n tests if ref branch when present is not develop
* fix(deps): bump theme versions
* fix(deps): bump ntfy and 2factor
* chore: up harmony
* fix: add missing return
* fix: #11191, only focus on search input on md environments and up
* feat: allow file uploads on mobile chat
closes https://github.com/NodeBB/NodeBB/issues/11217
* chore: up themes
* chore: add lang string
* fix(deps): bump ntfy to 1.0.15
* refactor: use new if/each syntax
* chore: up composer
* fix: regression from user helper refactor
* chore: up harmony
* chore: up composer
* chore: up harmony
* chore: up harmony
* chore: up harmony
* chore: fix composer version
* feat: add increment helper
* chore: up harmony
* fix: #11228 no timestamps in future :hourglass:
* chore: up harmony
* check config.theme as well
fire action:posts.loaded after processing dom
* chore: up harmony
* chore: up harmony
* chore: up harmony
* chore: up themes
* chore: up harmony
* remove extra class
* refactor: move these to core from harmony
* chore: up widgets
* chore: up widgets
* height auto
* fix: closes #11238
* dont focus inputs, annoying on mobile
* fix: dont focus twice, only focus on chat input on desktop
dont wrap widget footer in row
* chore: up harmony
* chore: up harmony
* update chat window
* chore: up themes
* fix cache buster for skins
* chat fixes
* chore: up harmony
* chore: up composer
* refactor: change hook logs to debug
* fix: scroll to post right after adding to dom
* fix: hash scrolling and highlighting correct post
* test: re-enable read API schema tests
* fix: add back schema changes for 179faa2270f2ad955dcc4a7b04755acce59e6ffd and c3920ccb10d8ead2dcd9914bb1784bed3f6adfd4
* fix: schema changes from 488f0978a4aa1ca1e4d2a1f2e8c7ef7a681f2f27
* fix: schema changes for f4cf482a874701ce80c0f306c49d8788cec66f87
* fix: schema update for be6bbabd0e2551fbe9571dcf3ee40ad721764543
* fix: schema changes for 69c96078ea78ee2c45885a90a6f6a59f9042a33c
* fix: schema changes for d1364c313021e48a879a818b24947e1457c062f7
* fix: schema changes for 84ff1152f7552dd866e25a90972d970b9861107e
* fix: schema changes for b860c2605c209e0650ef98f4c80d842ea23a51ce
* fix: schema changes for 23cb67a1126481848fac39aafd1e253441e76d7f
* fix: schema changes for b916e42f400dac8aa51670b15e439f87f0eb8939
* fix: schema change for a9bbb586fcb3a1c61b5fb69052236e78cdf7d743
* fix: schema changes for 4b738c8cd36c936a1dbe2bb900c694bf6c5520ec
* fix: schema changes for 58b5781cea9acb129e6604a82ab5a5bfc0d8394d
* fix: schema changes for 794bf01b21709c4be06584d576d706b3d6342057
* fix: schema changes for 80ea12c1c1963f5b39fb64841e4f3c8da3c87af2, e368feef51e0766f119c9710fb4db8f64724725c, and 52ead114bec961c62fa2eb0786540e229f6e4873
* fix: composer-default object in config?
* fix: schema changes for 9acdc6808c070555352951c651921df181b10993 and 093093420027999df3c67bf0ea6024f6dbf81d2d
* fix: schema changes for c0a52924f1f7ef8caeaacda67363ac269b56042c
* fix: schema change for aba420a3f3b774e949c2539c73f3dc0e1ae79a38, move loggedInUser to optional props
* fix: schema changes for 8c67031609da30d788561459f8bb76e9a69253de
* fix: schema changes for 27e53b42f3ce48fa61d3754375715cd41ffe808d
* fix: schema changes for 28359665187b0a3b9ec6226dca1234ebdbd725a5
* fix: breaking test for email confirmation API call
* fix: schema changes for refactored search page
* fix: schema changes for user object
* fix: schema changes for 9f531f957e08eabb4bae844ddd67bde14d9b59f0
* fix: schema changes for c4042c70decd628e5b880bd109515b47e4e16164 and 23175110a29640e6fa052db1079bfedb34a61055
* fix: schema changes for 9b3616b10392e247974eb0c1e6225a1582bf6c69
* fix: schema changes for 5afd5de07d42fd33f039a6f85ded3b4992200e5a
* fix: schema change for 1d7baf12171cffbd3af8914bef4e6297d1160d49
* fix: schema changes for 57bfb37c55a839662144e684875003ab52315ecc and be6bbabd0e2551fbe9571dcf3ee40ad721764543
* fix: schema changes for 6e86b4afa20d662af8b9f1c07518df2d8c258105 and 3efad2e13b7319eb9a1f4fda7af047be43ebc11f and 68f66223e73a72f378f193c83a9b5546bede2cda
* fix: allowing optional qs prop in pagination keys (not sure why this didn't break before)
* fix: re-login on email change
* fix: schema changes for c926358d734a2fa410de87f4e4a91744215fc14a
* fix: schema changes for 388a8270c9882892bad5c8141f65da8d59eac0fd
* fix: schema change for 2658bcc821c22e137a6eeb9bb74098856a642eaf
* fix: no need to call account middlewares for chats routes
* fix: schema changes for 71743affc3e58dc85d4ffa15ce043d4d9ddd3d67
* fix: final schema changes
* test: support for anyOf and oneOf
* fix: check thumb
* dont scroll to top on back press
* remove group log
* fix: add top margin to merged and deleted alerts
* chore: up widgets
* fix: improve fix-lists mixin
* chore: up harmony/composer
* feat: allow hiding quicksearch results during search
* dont record searches made by composer
* chore: up 54
* chore: up spam be gone
* feat: add prev/next page and page count into mobile paginator
* chore: up harmony
* chore: up harmony
* use old style for IS
* fix: hide entire toolbar row if no posts or not singlePost
* fix: updated messaging for post-queue template, #11206
* fix: btn-sm on post queue back button
* fix: bump harmony, closes #11206
* fix: remove unused alert module import
* fix: bump harmony
* fix: bump harmony
* chore: up harmony
* refactor: IS scrolltop
* fix: update users:search-user-for-chat source string
* feat: support for mark-read toggle on chats dropdown and recent chats list
* feat: api v3 calls to mark chat read/unread
* feat: send event:chats.mark socket event on mark read or unread
* refactor: allow frontend to mark chats as unread, use new API v3 routes instead of socket calls, better frontend event handling
* docs: openapi schema updates for chat marking
* fix: allow unread state toggling in chats dropdown too
* fix: issue where repeated openings of the chats dropdown would continually add events for mark-read/unread
* fix: debug log
* refactor: move userSearch filter to a module
* feat(routes): allow remounting /categories (#11230)
* feat: send flags count to frontend on flags list page
* refactor: filter form client-side js to extract out some logic
* fix: applyFilters to not take any arguments, update selectedCids in updateButton instead of onHidden
* fix: use userFilter module for assignee, reporterId, targetUid
* fix(openapi): schema changes for updated flags page
* fix: dont allow adding duplicates to userFilter
* use same var
* remove log
* fix: closes #11282
* feat: lang key for x-topics
* chore: up harmony
* chore: up emoji
* chore: up harmony
* fix: update userFilter to allow new option `selectedBlock`
* fix: wrong block name passed to userFilter
* fix: https://github.com/NodeBB/NodeBB/issues/11283
* fix: chats, allow multiple dropdowns like in harmony
* chore: up harmony
* refactor: flag note adding/editing, closes #11285
* fix: remove old prepareEdit logic
* chore: add caveat about hacky code block in userFilter module
* fix: placeholders for userFilter module
* refactor: navigator so it works with multiple thumbs/navigators
* chore: up harmony
* fix: closes #11287, destroy quick reply autocomplete
on navigation
* fix: filter disabled categories on user categories page count
* chore: up harmony
* docs: update openapi spec to include info about passing in timestamps for topic creation, removing timestamp as valid request param for topic replying
* fix: send back null values on ACP search dashboard for startDate and endDate if not expicitly passed in, fix tests
* fix: tweak table order in ACP dash searches
* fix: only invoke navigator click drag on left mouse button
* feat: add back unread indicator to navigator
* clear bookmark on mark unread
* fix: navigator crash on ajaxify
* better thumb top calculation
* fix: reset user bookmark when topic is marked unread
* Revert "fix: reset user bookmark when topic is marked unread"
This reverts commit 9bcd85c2c6848c3d325d32027261809da6e11c9e.
* fix: update unread indicator on scroll, add unread count
* chore: bump harmony
* fix: crash on navigator unread update when backing out of a topic
* fix: closes #11183
* fix: update topics:recent zset when rescheduling a topic
* fix: dupe quote button, increase delay, hide immediately on empty selection
* fix: navigator not showing up on first load
* refactor: remove glance
assorted fixes to navigator
dont reduce remaning count if user scrolls down and up quickly
only call topic.navigatorCallback when index changes
* more sanity checks for bookmark
dont allow setting bookmark higher than topic postcount
* closes #11218, :train:
* Revert "fix: update topics:recent zset when rescheduling a topic"
This reverts commit 737973cca9e94b6cb3867492a09e1e0b1af391d5.
* fix: #11306, show proper error if queued post doesn't exist
was showing no-privileges if someone else accepted the post
* https://github.com/NodeBB/NodeBB/issues/11307
dont use li
* chore: up harmony
* chore: bump version string
* fix: copy paste fail
* feat: closes #7382, tag filtering
add client side support for filtering by tags on /category, /recent and /unread
* chore: up harmony
* chore: up harmony
* Revert "fix: add back req.query fallback for backwards compatibility" [breaking]
This reverts commit cf6cc2c454dc35c330393c62ee8ce67b42d8eefb.
This commit is no longer required as passing in a CSRF token via query parameter is no longer supported as of NodeBB v3.x
This is a breaking change.
* fix: pass csrf token in form data, re: NodeBB/NodeBB#11309
* chore: up deps
* fix: tests, use x-csrf-token query param removed
* test: fix csrf_token
* lint: remove unused
* feat: add itemprop="image" to avatar helper
* fix: get chat upload button in chat modal
* breaking: remove deprecated socket.io methods
* test: update messaging tests to not use sockets
* fix: parent post links
* fix: prevent post tooltip if mouse leaves before data/tpl is loaded
* chore: up harmony
* chore: up harmony
* chore: up harmony
* chore: up harmony
* fix: nested replies indices
* fix(deps): bump 2factor
* feat: add loggedIn user to all api routes
* chore: up themes
* refactor: audit admin v3 write api routes as per #11321
* refactor: audit category v3 write api routes as per #11321 [breaking]
docs: fix open api spec for #11321
* refactor: audit chat v3 write api routes as per #11321
* refactor: audit files v3 write api routes as per #11321
* refactor: audit flags v3 write api routes as per #11321
* refactor: audit posts v3 write api routes as per #11321
* refactor: audit topics v3 write api routes as per #11321
* refactor: audit users v3 write api routes as per #11321
* fix: lang string
* remove min height
* fix: empty topic/labels taking up space
* fix: tag filtering when changing filter to watched topics
or changing popular time limit to month
* chore: up harmony
* fix: closes #11354, show no post error if queued post already accepted/rejected
* test: #11354
* test: #11354
* fix(deps): bump 2factor
* fix: #11357 clear cache on thumb remove
* fix: thumb remove on windows, closes #11357
* test: openapi for thumbs
* test: fix openapi
---------
Co-authored-by: Julian Lam <julian@nodebb.org>
Co-authored-by: Opliko <opliko.reg@protonmail.com>
											 
										 
										
											2023-03-17 11:58:31 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// wait for export child processes to complete
 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-12 15:57:36 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										await  wait ( 5000 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-06-23 00:46:59 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-04-23 21:50:08 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Attach a search hook so /api/search is enabled
 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-27 17:36:58 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										plugins . hooks . register ( 'core' ,  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-23 21:50:08 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											hook :  'filter:search.query' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											method :  dummySearchHook , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-05 14:25:14 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Attach an emailer hook so related requests do not error
 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-27 17:36:58 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										plugins . hooks . register ( 'emailer-test' ,  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-05 10:41:23 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											hook :  'static:email.send' , 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-05 14:25:14 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											method :  dummyEmailerHook , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-23 21:50:08 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-07 09:48:49 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// All tests run as admin user
 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-22 19:23:51 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										( {  jar  }  =  await  helpers . loginUser ( 'admin' ,  '123456' ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-26 21:51:25 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Retrieve CSRF token using cookie, to test Write API
 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-18 12:08:34 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										csrfToken  =  await  helpers . getCsrfToken ( jar ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-26 21:51:25 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-17 14:46:53 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Pre-seed ActivityPub cache so contrived actor assertions pass
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										activitypub . _cache . set ( ` 0;https://example.org/foobar ` ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											id :  'https://example.org/foobar' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											name :  'foobar' , 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-05 13:33:00 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											publicKey :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												id :  ` https://example.org/foobar#key ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												owner :  ` https://example.org/foobar ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												publicKeyPem :  'secretcat' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-17 14:46:53 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-04-23 21:50:08 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										setup  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-16 20:38:40 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									it ( 'should pass OpenAPI v3 validation' ,  async  ( )  =>  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										try  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-24 11:01:53 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											await  SwaggerParser . validate ( readApiPath ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											await  SwaggerParser . validate ( writeApiPath ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-16 20:38:40 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										}  catch  ( e )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											assert . ifError ( e ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-23 21:50:08 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-10-24 11:01:53 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									readApi  =  await  SwaggerParser . dereference ( readApiPath ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									writeApi  =  await  SwaggerParser . dereference ( writeApiPath ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-23 21:50:08 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-12-12 13:25:36 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									it ( 'should grab all mounted routes and ensure a schema exists' ,  async  ( )  =>  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										const  webserver  =  require ( '../src/webserver' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										const  buildPaths  =  function  ( stack ,  prefix )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-15 13:54:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											const  paths  =  stack . map ( ( dispatch )  =>  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( dispatch . route  &&  dispatch . route . path  &&  typeof  dispatch . route . path  ===  'string' )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( ! prefix  &&  ! dispatch . route . path . startsWith ( '/api/' ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														return  null ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-18 12:28:32 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( prefix  ===  nconf . get ( 'relative_path' ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														prefix  =  '' ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-12-15 13:54:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													return  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														method :  Object . keys ( dispatch . route . methods ) [ 0 ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														path :  ( prefix  ||  '' )  +  dispatch . route . path , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												}  else  if  ( dispatch . name  ===  'router' )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													const  prefix  =  dispatch . regexp . toString ( ) . replace ( '/^' ,  '' ) . replace ( '\\/?(?=\\/|$)/i' ,  '' ) . replace ( /\\\//g ,  '/' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													return  buildPaths ( dispatch . handle . stack ,  prefix ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-12 13:25:36 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-12-15 13:54:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												// Drop any that aren't actual routes (middlewares, error handlers, etc.)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return  null ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-12-18 11:43:29 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  _ . flatten ( paths ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-12 13:25:36 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-15 13:54:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-02-04 00:01:39 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										let  paths  =  buildPaths ( webserver . app . _router . stack ) . filter ( Boolean ) . map ( ( pathObj )  =>  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-14 15:24:46 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											pathObj . path  =  pathObj . path . replace ( /\/:([^\\/]+)/g ,  '/{$1}' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  pathObj ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-20 13:43:50 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  exclusionPrefixes  =  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											'/api/admin/plugins' ,  '/api/compose' ,  '/debug' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											'/api/user/{userslug}/theme' ,  // from persona
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										] ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-04 00:01:39 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										paths  =  paths . filter ( path  =>  path . method  !==  '_all'  &&  ! exclusionPrefixes . some ( prefix  =>  path . path . startsWith ( prefix ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-15 13:54:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-12-12 13:25:36 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// For each express path, query for existence in read and write api schemas
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										paths . forEach ( ( pathObj )  =>  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											describe ( ` ${ pathObj . method . toUpperCase ( ) }   ${ pathObj . path } ` ,  ( )  =>  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												it ( 'should be defined in schema docs' ,  ( )  =>  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-15 13:54:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													let  schema  =  readApi ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( pathObj . path . startsWith ( '/api/v3' ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														schema  =  writeApi ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														pathObj . path  =  pathObj . path . replace ( '/api/v3' ,  '' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-17 15:02:09 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													// Don't check non-GET routes in Read API
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( schema  ===  readApi  &&  pathObj . method  !==  'get' )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-12-12 13:25:36 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													const  normalizedPath  =  pathObj . path . replace ( /\/:([^\\/]+)/g ,  '/{$1}' ) . replace ( /\?/g ,  '' ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-22 10:26:02 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													assert ( schema . paths . hasOwnProperty ( normalizedPath ) ,  ` ${ pathObj . path }  is not defined in schema docs ` ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													assert ( schema . paths [ normalizedPath ] . hasOwnProperty ( pathObj . method ) ,  ` ${ pathObj . path }  was found in schema docs, but  ${ pathObj . method . toUpperCase ( ) }  method is not defined ` ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-12 13:25:36 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												Bootstrap5 (#10894)
* chore: up deps
* chore: up composer
* fix(deps): bump 2factor to v7
* chore: up harmony
* chore: up harmony
* fix: missing await
* feat: allow middlewares to pass in template values via res.locals
* feat: buildAccountData middleware automatically added ot all account routes
* fix: properly allow values in res.locals.templateValues to be added to the template data
* refactor: user/blocks
* refactor(accounts): categories and consent
* feat: automatically 404 if exposeUid or exposeGroupName come up empty
* refactor: remove calls to getUserDataByUserSlug for most account routes, since it is populated via middleware now
* fix: allow exposeUid and exposeGroupName to work with slugs with mixed capitalization
* fix: move reputation removal check to accountHelpers method
* test: skip i18n tests if ref branch when present is not develop
* fix(deps): bump theme versions
* fix(deps): bump ntfy and 2factor
* chore: up harmony
* fix: add missing return
* fix: #11191, only focus on search input on md environments and up
* feat: allow file uploads on mobile chat
closes https://github.com/NodeBB/NodeBB/issues/11217
* chore: up themes
* chore: add lang string
* fix(deps): bump ntfy to 1.0.15
* refactor: use new if/each syntax
* chore: up composer
* fix: regression from user helper refactor
* chore: up harmony
* chore: up composer
* chore: up harmony
* chore: up harmony
* chore: up harmony
* chore: fix composer version
* feat: add increment helper
* chore: up harmony
* fix: #11228 no timestamps in future :hourglass:
* chore: up harmony
* check config.theme as well
fire action:posts.loaded after processing dom
* chore: up harmony
* chore: up harmony
* chore: up harmony
* chore: up themes
* chore: up harmony
* remove extra class
* refactor: move these to core from harmony
* chore: up widgets
* chore: up widgets
* height auto
* fix: closes #11238
* dont focus inputs, annoying on mobile
* fix: dont focus twice, only focus on chat input on desktop
dont wrap widget footer in row
* chore: up harmony
* chore: up harmony
* update chat window
* chore: up themes
* fix cache buster for skins
* chat fixes
* chore: up harmony
* chore: up composer
* refactor: change hook logs to debug
* fix: scroll to post right after adding to dom
* fix: hash scrolling and highlighting correct post
* test: re-enable read API schema tests
* fix: add back schema changes for 179faa2270f2ad955dcc4a7b04755acce59e6ffd and c3920ccb10d8ead2dcd9914bb1784bed3f6adfd4
* fix: schema changes from 488f0978a4aa1ca1e4d2a1f2e8c7ef7a681f2f27
* fix: schema changes for f4cf482a874701ce80c0f306c49d8788cec66f87
* fix: schema update for be6bbabd0e2551fbe9571dcf3ee40ad721764543
* fix: schema changes for 69c96078ea78ee2c45885a90a6f6a59f9042a33c
* fix: schema changes for d1364c313021e48a879a818b24947e1457c062f7
* fix: schema changes for 84ff1152f7552dd866e25a90972d970b9861107e
* fix: schema changes for b860c2605c209e0650ef98f4c80d842ea23a51ce
* fix: schema changes for 23cb67a1126481848fac39aafd1e253441e76d7f
* fix: schema changes for b916e42f400dac8aa51670b15e439f87f0eb8939
* fix: schema change for a9bbb586fcb3a1c61b5fb69052236e78cdf7d743
* fix: schema changes for 4b738c8cd36c936a1dbe2bb900c694bf6c5520ec
* fix: schema changes for 58b5781cea9acb129e6604a82ab5a5bfc0d8394d
* fix: schema changes for 794bf01b21709c4be06584d576d706b3d6342057
* fix: schema changes for 80ea12c1c1963f5b39fb64841e4f3c8da3c87af2, e368feef51e0766f119c9710fb4db8f64724725c, and 52ead114bec961c62fa2eb0786540e229f6e4873
* fix: composer-default object in config?
* fix: schema changes for 9acdc6808c070555352951c651921df181b10993 and 093093420027999df3c67bf0ea6024f6dbf81d2d
* fix: schema changes for c0a52924f1f7ef8caeaacda67363ac269b56042c
* fix: schema change for aba420a3f3b774e949c2539c73f3dc0e1ae79a38, move loggedInUser to optional props
* fix: schema changes for 8c67031609da30d788561459f8bb76e9a69253de
* fix: schema changes for 27e53b42f3ce48fa61d3754375715cd41ffe808d
* fix: schema changes for 28359665187b0a3b9ec6226dca1234ebdbd725a5
* fix: breaking test for email confirmation API call
* fix: schema changes for refactored search page
* fix: schema changes for user object
* fix: schema changes for 9f531f957e08eabb4bae844ddd67bde14d9b59f0
* fix: schema changes for c4042c70decd628e5b880bd109515b47e4e16164 and 23175110a29640e6fa052db1079bfedb34a61055
* fix: schema changes for 9b3616b10392e247974eb0c1e6225a1582bf6c69
* fix: schema changes for 5afd5de07d42fd33f039a6f85ded3b4992200e5a
* fix: schema change for 1d7baf12171cffbd3af8914bef4e6297d1160d49
* fix: schema changes for 57bfb37c55a839662144e684875003ab52315ecc and be6bbabd0e2551fbe9571dcf3ee40ad721764543
* fix: schema changes for 6e86b4afa20d662af8b9f1c07518df2d8c258105 and 3efad2e13b7319eb9a1f4fda7af047be43ebc11f and 68f66223e73a72f378f193c83a9b5546bede2cda
* fix: allowing optional qs prop in pagination keys (not sure why this didn't break before)
* fix: re-login on email change
* fix: schema changes for c926358d734a2fa410de87f4e4a91744215fc14a
* fix: schema changes for 388a8270c9882892bad5c8141f65da8d59eac0fd
* fix: schema change for 2658bcc821c22e137a6eeb9bb74098856a642eaf
* fix: no need to call account middlewares for chats routes
* fix: schema changes for 71743affc3e58dc85d4ffa15ce043d4d9ddd3d67
* fix: final schema changes
* test: support for anyOf and oneOf
* fix: check thumb
* dont scroll to top on back press
* remove group log
* fix: add top margin to merged and deleted alerts
* chore: up widgets
* fix: improve fix-lists mixin
* chore: up harmony/composer
* feat: allow hiding quicksearch results during search
* dont record searches made by composer
* chore: up 54
* chore: up spam be gone
* feat: add prev/next page and page count into mobile paginator
* chore: up harmony
* chore: up harmony
* use old style for IS
* fix: hide entire toolbar row if no posts or not singlePost
* fix: updated messaging for post-queue template, #11206
* fix: btn-sm on post queue back button
* fix: bump harmony, closes #11206
* fix: remove unused alert module import
* fix: bump harmony
* fix: bump harmony
* chore: up harmony
* refactor: IS scrolltop
* fix: update users:search-user-for-chat source string
* feat: support for mark-read toggle on chats dropdown and recent chats list
* feat: api v3 calls to mark chat read/unread
* feat: send event:chats.mark socket event on mark read or unread
* refactor: allow frontend to mark chats as unread, use new API v3 routes instead of socket calls, better frontend event handling
* docs: openapi schema updates for chat marking
* fix: allow unread state toggling in chats dropdown too
* fix: issue where repeated openings of the chats dropdown would continually add events for mark-read/unread
* fix: debug log
* refactor: move userSearch filter to a module
* feat(routes): allow remounting /categories (#11230)
* feat: send flags count to frontend on flags list page
* refactor: filter form client-side js to extract out some logic
* fix: applyFilters to not take any arguments, update selectedCids in updateButton instead of onHidden
* fix: use userFilter module for assignee, reporterId, targetUid
* fix(openapi): schema changes for updated flags page
* fix: dont allow adding duplicates to userFilter
* use same var
* remove log
* fix: closes #11282
* feat: lang key for x-topics
* chore: up harmony
* chore: up emoji
* chore: up harmony
* fix: update userFilter to allow new option `selectedBlock`
* fix: wrong block name passed to userFilter
* fix: https://github.com/NodeBB/NodeBB/issues/11283
* fix: chats, allow multiple dropdowns like in harmony
* chore: up harmony
* refactor: flag note adding/editing, closes #11285
* fix: remove old prepareEdit logic
* chore: add caveat about hacky code block in userFilter module
* fix: placeholders for userFilter module
* refactor: navigator so it works with multiple thumbs/navigators
* chore: up harmony
* fix: closes #11287, destroy quick reply autocomplete
on navigation
* fix: filter disabled categories on user categories page count
* chore: up harmony
* docs: update openapi spec to include info about passing in timestamps for topic creation, removing timestamp as valid request param for topic replying
* fix: send back null values on ACP search dashboard for startDate and endDate if not expicitly passed in, fix tests
* fix: tweak table order in ACP dash searches
* fix: only invoke navigator click drag on left mouse button
* feat: add back unread indicator to navigator
* clear bookmark on mark unread
* fix: navigator crash on ajaxify
* better thumb top calculation
* fix: reset user bookmark when topic is marked unread
* Revert "fix: reset user bookmark when topic is marked unread"
This reverts commit 9bcd85c2c6848c3d325d32027261809da6e11c9e.
* fix: update unread indicator on scroll, add unread count
* chore: bump harmony
* fix: crash on navigator unread update when backing out of a topic
* fix: closes #11183
* fix: update topics:recent zset when rescheduling a topic
* fix: dupe quote button, increase delay, hide immediately on empty selection
* fix: navigator not showing up on first load
* refactor: remove glance
assorted fixes to navigator
dont reduce remaning count if user scrolls down and up quickly
only call topic.navigatorCallback when index changes
* more sanity checks for bookmark
dont allow setting bookmark higher than topic postcount
* closes #11218, :train:
* Revert "fix: update topics:recent zset when rescheduling a topic"
This reverts commit 737973cca9e94b6cb3867492a09e1e0b1af391d5.
* fix: #11306, show proper error if queued post doesn't exist
was showing no-privileges if someone else accepted the post
* https://github.com/NodeBB/NodeBB/issues/11307
dont use li
* chore: up harmony
* chore: bump version string
* fix: copy paste fail
* feat: closes #7382, tag filtering
add client side support for filtering by tags on /category, /recent and /unread
* chore: up harmony
* chore: up harmony
* Revert "fix: add back req.query fallback for backwards compatibility" [breaking]
This reverts commit cf6cc2c454dc35c330393c62ee8ce67b42d8eefb.
This commit is no longer required as passing in a CSRF token via query parameter is no longer supported as of NodeBB v3.x
This is a breaking change.
* fix: pass csrf token in form data, re: NodeBB/NodeBB#11309
* chore: up deps
* fix: tests, use x-csrf-token query param removed
* test: fix csrf_token
* lint: remove unused
* feat: add itemprop="image" to avatar helper
* fix: get chat upload button in chat modal
* breaking: remove deprecated socket.io methods
* test: update messaging tests to not use sockets
* fix: parent post links
* fix: prevent post tooltip if mouse leaves before data/tpl is loaded
* chore: up harmony
* chore: up harmony
* chore: up harmony
* chore: up harmony
* fix: nested replies indices
* fix(deps): bump 2factor
* feat: add loggedIn user to all api routes
* chore: up themes
* refactor: audit admin v3 write api routes as per #11321
* refactor: audit category v3 write api routes as per #11321 [breaking]
docs: fix open api spec for #11321
* refactor: audit chat v3 write api routes as per #11321
* refactor: audit files v3 write api routes as per #11321
* refactor: audit flags v3 write api routes as per #11321
* refactor: audit posts v3 write api routes as per #11321
* refactor: audit topics v3 write api routes as per #11321
* refactor: audit users v3 write api routes as per #11321
* fix: lang string
* remove min height
* fix: empty topic/labels taking up space
* fix: tag filtering when changing filter to watched topics
or changing popular time limit to month
* chore: up harmony
* fix: closes #11354, show no post error if queued post already accepted/rejected
* test: #11354
* test: #11354
* fix(deps): bump 2factor
* fix: #11357 clear cache on thumb remove
* fix: thumb remove on windows, closes #11357
* test: openapi for thumbs
* test: fix openapi
---------
Co-authored-by: Julian Lam <julian@nodebb.org>
Co-authored-by: Opliko <opliko.reg@protonmail.com>
											 
										 
										
											2023-03-17 11:58:31 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									generateTests ( readApi ,  Object . keys ( readApi . paths ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-18 11:23:16 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									generateTests ( writeApi ,  Object . keys ( writeApi . paths ) ,  writeApi . servers [ 0 ] . url ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-26 21:51:25 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									function  generateTests ( api ,  paths ,  prefix )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-04 02:07:29 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Iterate through all documented paths, make a call to it,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// and compare the result body with what is defined in the spec
 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-18 16:42:18 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  pathLib  =  path ;  // for calling path module from inside this forEach
 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-26 21:51:25 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										paths . forEach ( ( path )  =>  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											const  context  =  api . paths [ path ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											let  schema ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-18 12:08:34 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											let  result ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-26 21:51:25 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											let  url ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											let  method ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											const  headers  =  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											const  qs  =  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Object . keys ( context ) . forEach ( ( _method )  =>  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-16 20:10:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												// Only test GET routes in the Read API
 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-27 11:02:20 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( api . info . title  ===  'NodeBB Read API'  &&  _method  !==  'get' )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-26 21:51:25 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-12 15:52:33 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												it ( 'should have each path parameter defined in its context' ,  ( )  =>  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-26 21:51:25 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													method  =  _method ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-12 15:52:33 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( ! context [ method ] . parameters )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-12-18 11:23:16 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													const  pathParams  =  ( path . match ( /{[\w\-_*]+}?/g )  ||  [ ] ) . map ( match  =>  match . slice ( 1 ,  - 1 ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													const  schemaParams  =  context [ method ] . parameters . map ( param  =>  ( param . in  ===  'path'  ?  param . name  :  null ) ) . filter ( Boolean ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													assert ( pathParams . every ( param  =>  schemaParams . includes ( param ) ) ,  ` ${ method . toUpperCase ( ) }   ${ path }  has path parameters specified but not defined ` ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-12 15:52:33 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												it ( 'should have examples when parameters are present' ,  ( )  =>  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-06 14:10:15 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													let  {  parameters  }  =  context [ method ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-26 21:51:25 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													let  testPath  =  path ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( parameters )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														// Use mock data if provided
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														parameters  =  mocks [ method ] [ path ]  ||  parameters ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														parameters . forEach ( ( param )  =>  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															assert ( param . example  !==  null  &&  param . example  !==  undefined ,  ` ${ method . toUpperCase ( ) }   ${ path }  has parameters without examples ` ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															switch  ( param . in )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																case  'path' : 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-03 23:59:08 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																	testPath  =  testPath . replace ( ` { ${ param . name } } ` ,  param . example ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-26 21:51:25 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																	break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																case  'header' : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																	headers [ param . name ]  =  param . example ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																	break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																case  'query' : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																	qs [ param . name ]  =  param . example ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																	break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-10-27 11:02:20 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													url  =  nconf . get ( 'url' )  +  ( prefix  ||  '' )  +  testPath ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-26 21:51:25 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-12-04 12:56:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												it ( 'should contain a valid request body (if present) with application/json or multipart/form-data type if POST/PUT/DELETE' ,  ( )  =>  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-26 21:51:25 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( [ 'post' ,  'put' ,  'delete' ] . includes ( method )  &&  context [ method ] . hasOwnProperty ( 'requestBody' ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-16 20:10:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														const  failMessage  =  ` ${ method . toUpperCase ( ) }   ${ path }  has a malformed request body ` ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														assert ( context [ method ] . requestBody ,  failMessage ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														assert ( context [ method ] . requestBody . content ,  failMessage ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-04 12:56:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														if  ( context [ method ] . requestBody . content . hasOwnProperty ( 'application/json' ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-16 20:10:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															assert ( context [ method ] . requestBody . content [ 'application/json' ] ,  failMessage ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															assert ( context [ method ] . requestBody . content [ 'application/json' ] . schema ,  failMessage ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															assert ( context [ method ] . requestBody . content [ 'application/json' ] . schema . properties ,  failMessage ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-04 12:56:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														}  else  if  ( context [ method ] . requestBody . content . hasOwnProperty ( 'multipart/form-data' ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-16 20:10:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															assert ( context [ method ] . requestBody . content [ 'multipart/form-data' ] ,  failMessage ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															assert ( context [ method ] . requestBody . content [ 'multipart/form-data' ] . schema ,  failMessage ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															assert ( context [ method ] . requestBody . content [ 'multipart/form-data' ] . schema . properties ,  failMessage ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-04 12:56:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-26 21:51:25 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2025-06-26 13:01:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												it ( 'should not error out when called' ,  async  function  ( )  { 
							 
						 
					
						
							
								
									
										
										
										
											2025-06-26 12:55:31 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													this . timeout ( 0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-26 21:51:25 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													await  setupData ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( csrfToken )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														headers [ 'x-csrf-token' ]  =  csrfToken ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													let  body  =  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-04 12:56:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													let  type  =  'json' ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-01 11:19:04 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														context [ method ] . hasOwnProperty ( 'requestBody' )  && 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														context [ method ] . requestBody . required  !==  false  && 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														context [ method ] . requestBody . content [ 'application/json' ] )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-26 21:51:25 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														body  =  buildBody ( context [ method ] . requestBody . content [ 'application/json' ] . schema . properties ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-04 12:56:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													}  else  if  ( context [ method ] . hasOwnProperty ( 'requestBody' )  &&  context [ method ] . requestBody . content [ 'multipart/form-data' ] )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														type  =  'form' ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-26 21:51:25 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													try  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-04 12:56:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														if  ( type  ===  'json' )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-18 12:08:34 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															const  searchParams  =  new  URLSearchParams ( qs ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															result  =  await  request [ method ] ( ` ${ url } ? ${ searchParams } ` ,  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-04 12:56:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																jar :  ! unauthenticatedRoutes . includes ( path )  ?  jar  :  undefined , 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-18 12:08:34 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																maxRedirect :  0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																redirect :  'manual' , 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-04 12:56:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																headers :  headers , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																body :  body , 
							 
						 
					
						
							
								
									
										
										
										
											2025-06-26 13:10:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																timeout :  30000 , 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-04 12:56:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														}  else  if  ( type  ===  'form' )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-18 12:08:34 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															result  =  await  helpers . uploadFile ( url ,  pathLib . join ( _ _dirname ,  './files/test.png' ) ,  { } ,  jar ,  csrfToken ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-04 12:56:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-26 21:51:25 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													}  catch  ( e )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-07 14:44:51 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														assert ( ! e ,  ` ${ method . toUpperCase ( ) }   ${ path }  errored with:  ${ e . message } ` ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-26 21:51:25 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-12-17 21:54:38 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												it ( 'response status code should match one of the schema defined responses' ,  ( )  =>  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													// HACK: allow HTTP 418 I am a teapot, for now   👇
 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-18 12:08:34 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													const  {  responses  }  =  context [ method ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													assert ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														responses . hasOwnProperty ( '418' )  || 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Object . keys ( responses ) . includes ( String ( result . response . statusCode ) ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														` ${ method . toUpperCase ( ) }   ${ path }  sent back unexpected HTTP status code:  ${ result . response . statusCode } ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-17 21:54:38 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-10-26 21:51:25 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												// Recursively iterate through schema properties, comparing type
 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-17 21:54:38 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												it ( 'response body should match schema definition' ,  ( )  =>  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													const  http302  =  context [ method ] . responses [ '302' ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-18 12:08:34 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( http302  &&  result . response . statusCode  ===  302 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-17 21:54:38 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														// Compare headers instead
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														const  expectedHeaders  =  Object . keys ( http302 . headers ) . reduce ( ( memo ,  name )  =>  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-18 12:28:32 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															const  value  =  http302 . headers [ name ] . schema . example ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															memo [ name ]  =  value . startsWith ( nconf . get ( 'relative_path' ) )  ?  value  :  nconf . get ( 'relative_path' )  +  value ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-17 21:54:38 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															return  memo ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} ,  { } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-02-04 01:34:30 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														for  ( const  header  of  Object . keys ( expectedHeaders ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-18 12:08:34 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															assert ( result . response . headers [ header . toLowerCase ( ) ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															assert . strictEqual ( result . response . headers [ header . toLowerCase ( ) ] ,  expectedHeaders [ header ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-17 21:54:38 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-12-18 12:08:34 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( result . response . statusCode  ===  400  &&  context [ method ] . responses [ '400' ] )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-30 19:29:46 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														// TODO: check 400 schema to response.body?
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-12-17 21:54:38 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													const  http200  =  context [ method ] . responses [ '200' ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( ! http200 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-26 21:51:25 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-12-18 12:08:34 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													assert . strictEqual ( result . response . statusCode ,  200 ,  ` HTTP 200 expected (path:  ${ method }   ${ path } ` ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-02 12:08:31 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-12-17 21:54:38 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													const  hasJSON  =  http200 . content  &&  http200 . content [ 'application/json' ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-26 21:51:25 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( hasJSON )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														schema  =  context [ method ] . responses [ '200' ] . content [ 'application/json' ] . schema ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-18 12:08:34 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														compare ( schema ,  result . body ,  method . toUpperCase ( ) ,  path ,  'root' ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-26 21:51:25 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													// TODO someday: text/csv, binary file type checking?
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												it ( 'should successfully re-login if needed' ,  async  ( )  =>  { 
							 
						 
					
						
							
								
									
										
											 
										
											
												Bootstrap5 (#10894)
* chore: up deps
* chore: up composer
* fix(deps): bump 2factor to v7
* chore: up harmony
* chore: up harmony
* fix: missing await
* feat: allow middlewares to pass in template values via res.locals
* feat: buildAccountData middleware automatically added ot all account routes
* fix: properly allow values in res.locals.templateValues to be added to the template data
* refactor: user/blocks
* refactor(accounts): categories and consent
* feat: automatically 404 if exposeUid or exposeGroupName come up empty
* refactor: remove calls to getUserDataByUserSlug for most account routes, since it is populated via middleware now
* fix: allow exposeUid and exposeGroupName to work with slugs with mixed capitalization
* fix: move reputation removal check to accountHelpers method
* test: skip i18n tests if ref branch when present is not develop
* fix(deps): bump theme versions
* fix(deps): bump ntfy and 2factor
* chore: up harmony
* fix: add missing return
* fix: #11191, only focus on search input on md environments and up
* feat: allow file uploads on mobile chat
closes https://github.com/NodeBB/NodeBB/issues/11217
* chore: up themes
* chore: add lang string
* fix(deps): bump ntfy to 1.0.15
* refactor: use new if/each syntax
* chore: up composer
* fix: regression from user helper refactor
* chore: up harmony
* chore: up composer
* chore: up harmony
* chore: up harmony
* chore: up harmony
* chore: fix composer version
* feat: add increment helper
* chore: up harmony
* fix: #11228 no timestamps in future :hourglass:
* chore: up harmony
* check config.theme as well
fire action:posts.loaded after processing dom
* chore: up harmony
* chore: up harmony
* chore: up harmony
* chore: up themes
* chore: up harmony
* remove extra class
* refactor: move these to core from harmony
* chore: up widgets
* chore: up widgets
* height auto
* fix: closes #11238
* dont focus inputs, annoying on mobile
* fix: dont focus twice, only focus on chat input on desktop
dont wrap widget footer in row
* chore: up harmony
* chore: up harmony
* update chat window
* chore: up themes
* fix cache buster for skins
* chat fixes
* chore: up harmony
* chore: up composer
* refactor: change hook logs to debug
* fix: scroll to post right after adding to dom
* fix: hash scrolling and highlighting correct post
* test: re-enable read API schema tests
* fix: add back schema changes for 179faa2270f2ad955dcc4a7b04755acce59e6ffd and c3920ccb10d8ead2dcd9914bb1784bed3f6adfd4
* fix: schema changes from 488f0978a4aa1ca1e4d2a1f2e8c7ef7a681f2f27
* fix: schema changes for f4cf482a874701ce80c0f306c49d8788cec66f87
* fix: schema update for be6bbabd0e2551fbe9571dcf3ee40ad721764543
* fix: schema changes for 69c96078ea78ee2c45885a90a6f6a59f9042a33c
* fix: schema changes for d1364c313021e48a879a818b24947e1457c062f7
* fix: schema changes for 84ff1152f7552dd866e25a90972d970b9861107e
* fix: schema changes for b860c2605c209e0650ef98f4c80d842ea23a51ce
* fix: schema changes for 23cb67a1126481848fac39aafd1e253441e76d7f
* fix: schema changes for b916e42f400dac8aa51670b15e439f87f0eb8939
* fix: schema change for a9bbb586fcb3a1c61b5fb69052236e78cdf7d743
* fix: schema changes for 4b738c8cd36c936a1dbe2bb900c694bf6c5520ec
* fix: schema changes for 58b5781cea9acb129e6604a82ab5a5bfc0d8394d
* fix: schema changes for 794bf01b21709c4be06584d576d706b3d6342057
* fix: schema changes for 80ea12c1c1963f5b39fb64841e4f3c8da3c87af2, e368feef51e0766f119c9710fb4db8f64724725c, and 52ead114bec961c62fa2eb0786540e229f6e4873
* fix: composer-default object in config?
* fix: schema changes for 9acdc6808c070555352951c651921df181b10993 and 093093420027999df3c67bf0ea6024f6dbf81d2d
* fix: schema changes for c0a52924f1f7ef8caeaacda67363ac269b56042c
* fix: schema change for aba420a3f3b774e949c2539c73f3dc0e1ae79a38, move loggedInUser to optional props
* fix: schema changes for 8c67031609da30d788561459f8bb76e9a69253de
* fix: schema changes for 27e53b42f3ce48fa61d3754375715cd41ffe808d
* fix: schema changes for 28359665187b0a3b9ec6226dca1234ebdbd725a5
* fix: breaking test for email confirmation API call
* fix: schema changes for refactored search page
* fix: schema changes for user object
* fix: schema changes for 9f531f957e08eabb4bae844ddd67bde14d9b59f0
* fix: schema changes for c4042c70decd628e5b880bd109515b47e4e16164 and 23175110a29640e6fa052db1079bfedb34a61055
* fix: schema changes for 9b3616b10392e247974eb0c1e6225a1582bf6c69
* fix: schema changes for 5afd5de07d42fd33f039a6f85ded3b4992200e5a
* fix: schema change for 1d7baf12171cffbd3af8914bef4e6297d1160d49
* fix: schema changes for 57bfb37c55a839662144e684875003ab52315ecc and be6bbabd0e2551fbe9571dcf3ee40ad721764543
* fix: schema changes for 6e86b4afa20d662af8b9f1c07518df2d8c258105 and 3efad2e13b7319eb9a1f4fda7af047be43ebc11f and 68f66223e73a72f378f193c83a9b5546bede2cda
* fix: allowing optional qs prop in pagination keys (not sure why this didn't break before)
* fix: re-login on email change
* fix: schema changes for c926358d734a2fa410de87f4e4a91744215fc14a
* fix: schema changes for 388a8270c9882892bad5c8141f65da8d59eac0fd
* fix: schema change for 2658bcc821c22e137a6eeb9bb74098856a642eaf
* fix: no need to call account middlewares for chats routes
* fix: schema changes for 71743affc3e58dc85d4ffa15ce043d4d9ddd3d67
* fix: final schema changes
* test: support for anyOf and oneOf
* fix: check thumb
* dont scroll to top on back press
* remove group log
* fix: add top margin to merged and deleted alerts
* chore: up widgets
* fix: improve fix-lists mixin
* chore: up harmony/composer
* feat: allow hiding quicksearch results during search
* dont record searches made by composer
* chore: up 54
* chore: up spam be gone
* feat: add prev/next page and page count into mobile paginator
* chore: up harmony
* chore: up harmony
* use old style for IS
* fix: hide entire toolbar row if no posts or not singlePost
* fix: updated messaging for post-queue template, #11206
* fix: btn-sm on post queue back button
* fix: bump harmony, closes #11206
* fix: remove unused alert module import
* fix: bump harmony
* fix: bump harmony
* chore: up harmony
* refactor: IS scrolltop
* fix: update users:search-user-for-chat source string
* feat: support for mark-read toggle on chats dropdown and recent chats list
* feat: api v3 calls to mark chat read/unread
* feat: send event:chats.mark socket event on mark read or unread
* refactor: allow frontend to mark chats as unread, use new API v3 routes instead of socket calls, better frontend event handling
* docs: openapi schema updates for chat marking
* fix: allow unread state toggling in chats dropdown too
* fix: issue where repeated openings of the chats dropdown would continually add events for mark-read/unread
* fix: debug log
* refactor: move userSearch filter to a module
* feat(routes): allow remounting /categories (#11230)
* feat: send flags count to frontend on flags list page
* refactor: filter form client-side js to extract out some logic
* fix: applyFilters to not take any arguments, update selectedCids in updateButton instead of onHidden
* fix: use userFilter module for assignee, reporterId, targetUid
* fix(openapi): schema changes for updated flags page
* fix: dont allow adding duplicates to userFilter
* use same var
* remove log
* fix: closes #11282
* feat: lang key for x-topics
* chore: up harmony
* chore: up emoji
* chore: up harmony
* fix: update userFilter to allow new option `selectedBlock`
* fix: wrong block name passed to userFilter
* fix: https://github.com/NodeBB/NodeBB/issues/11283
* fix: chats, allow multiple dropdowns like in harmony
* chore: up harmony
* refactor: flag note adding/editing, closes #11285
* fix: remove old prepareEdit logic
* chore: add caveat about hacky code block in userFilter module
* fix: placeholders for userFilter module
* refactor: navigator so it works with multiple thumbs/navigators
* chore: up harmony
* fix: closes #11287, destroy quick reply autocomplete
on navigation
* fix: filter disabled categories on user categories page count
* chore: up harmony
* docs: update openapi spec to include info about passing in timestamps for topic creation, removing timestamp as valid request param for topic replying
* fix: send back null values on ACP search dashboard for startDate and endDate if not expicitly passed in, fix tests
* fix: tweak table order in ACP dash searches
* fix: only invoke navigator click drag on left mouse button
* feat: add back unread indicator to navigator
* clear bookmark on mark unread
* fix: navigator crash on ajaxify
* better thumb top calculation
* fix: reset user bookmark when topic is marked unread
* Revert "fix: reset user bookmark when topic is marked unread"
This reverts commit 9bcd85c2c6848c3d325d32027261809da6e11c9e.
* fix: update unread indicator on scroll, add unread count
* chore: bump harmony
* fix: crash on navigator unread update when backing out of a topic
* fix: closes #11183
* fix: update topics:recent zset when rescheduling a topic
* fix: dupe quote button, increase delay, hide immediately on empty selection
* fix: navigator not showing up on first load
* refactor: remove glance
assorted fixes to navigator
dont reduce remaning count if user scrolls down and up quickly
only call topic.navigatorCallback when index changes
* more sanity checks for bookmark
dont allow setting bookmark higher than topic postcount
* closes #11218, :train:
* Revert "fix: update topics:recent zset when rescheduling a topic"
This reverts commit 737973cca9e94b6cb3867492a09e1e0b1af391d5.
* fix: #11306, show proper error if queued post doesn't exist
was showing no-privileges if someone else accepted the post
* https://github.com/NodeBB/NodeBB/issues/11307
dont use li
* chore: up harmony
* chore: bump version string
* fix: copy paste fail
* feat: closes #7382, tag filtering
add client side support for filtering by tags on /category, /recent and /unread
* chore: up harmony
* chore: up harmony
* Revert "fix: add back req.query fallback for backwards compatibility" [breaking]
This reverts commit cf6cc2c454dc35c330393c62ee8ce67b42d8eefb.
This commit is no longer required as passing in a CSRF token via query parameter is no longer supported as of NodeBB v3.x
This is a breaking change.
* fix: pass csrf token in form data, re: NodeBB/NodeBB#11309
* chore: up deps
* fix: tests, use x-csrf-token query param removed
* test: fix csrf_token
* lint: remove unused
* feat: add itemprop="image" to avatar helper
* fix: get chat upload button in chat modal
* breaking: remove deprecated socket.io methods
* test: update messaging tests to not use sockets
* fix: parent post links
* fix: prevent post tooltip if mouse leaves before data/tpl is loaded
* chore: up harmony
* chore: up harmony
* chore: up harmony
* chore: up harmony
* fix: nested replies indices
* fix(deps): bump 2factor
* feat: add loggedIn user to all api routes
* chore: up themes
* refactor: audit admin v3 write api routes as per #11321
* refactor: audit category v3 write api routes as per #11321 [breaking]
docs: fix open api spec for #11321
* refactor: audit chat v3 write api routes as per #11321
* refactor: audit files v3 write api routes as per #11321
* refactor: audit flags v3 write api routes as per #11321
* refactor: audit posts v3 write api routes as per #11321
* refactor: audit topics v3 write api routes as per #11321
* refactor: audit users v3 write api routes as per #11321
* fix: lang string
* remove min height
* fix: empty topic/labels taking up space
* fix: tag filtering when changing filter to watched topics
or changing popular time limit to month
* chore: up harmony
* fix: closes #11354, show no post error if queued post already accepted/rejected
* test: #11354
* test: #11354
* fix(deps): bump 2factor
* fix: #11357 clear cache on thumb remove
* fix: thumb remove on windows, closes #11357
* test: openapi for thumbs
* test: fix openapi
---------
Co-authored-by: Julian Lam <julian@nodebb.org>
Co-authored-by: Opliko <opliko.reg@protonmail.com>
											 
										 
										
											2023-03-17 11:58:31 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													const  reloginPaths  =  [ 'GET /api/user/{userslug}/edit/email' ,  'PUT /users/{uid}/password' ,  'DELETE /users/{uid}/sessions/{uuid}' ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-12 15:52:33 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( reloginPaths . includes ( ` ${ method . toUpperCase ( ) }   ${ path } ` ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-22 19:23:51 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														( {  jar  }  =  await  helpers . loginUser ( 'admin' ,  '123456' ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-23 10:38:31 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														let  sessionIds  =  await  db . getSortedSetRange ( 'uid:1:sessions' ,  0 ,  - 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														let  sessObj  =  await  db . sessionStoreGet ( sessionIds [ 0 ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														if  ( ! sessObj )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															// password changed so login with new pwd
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															( {  jar  }  =  await  helpers . loginUser ( 'admin' ,  '654321' ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															sessionIds  =  await  db . getSortedSetRange ( 'uid:1:sessions' ,  0 ,  - 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															sessObj  =  await  db . sessionStoreGet ( sessionIds [ 0 ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-26 17:34:04 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														const  {  uuid  }  =  sessObj . meta ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														mocks . delete [ '/users/{uid}/sessions/{uuid}' ] [ 1 ] . example  =  uuid ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-26 21:51:25 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														// Retrieve CSRF token using cookie, to test Write API
 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-18 12:08:34 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														csrfToken  =  await  helpers . getCsrfToken ( jar ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-26 21:51:25 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-24 12:41:26 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-23 21:50:08 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-26 21:51:25 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									function  buildBody ( schema )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  Object . keys ( schema ) . reduce ( ( memo ,  cur )  =>  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											memo [ cur ]  =  schema [ cur ] . example ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  memo ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-09 16:38:37 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-10-26 21:51:25 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									function  compare ( schema ,  response ,  method ,  path ,  context )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-24 11:01:53 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										let  required  =  [ ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										const  additionalProperties  =  schema . hasOwnProperty ( 'additionalProperties' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-12-29 10:31:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										function  flattenAllOf ( obj )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  obj . reduce ( ( memo ,  obj )  =>  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( obj . allOf )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													obj  =  {  properties :  flattenAllOf ( obj . allOf )  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-24 12:28:08 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													try  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														required  =  required . concat ( obj . required  ?  obj . required  :  Object . keys ( obj . properties ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													}  catch  ( e )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														assert . fail ( ` Syntax error re: allOf, perhaps you allOf'd an array? (path:  ${ method }   ${ path } , context:  ${ context } ) ` ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-29 10:31:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return  {  ... memo ,  ... obj . properties  } ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-24 11:01:53 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} ,  { } ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-29 10:31:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( schema . allOf )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											schema  =  flattenAllOf ( schema . allOf ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-24 11:01:53 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  if  ( schema . properties )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											required  =  schema . required  ||  Object . keys ( schema . properties ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											schema  =  schema . properties ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// If schema contains no properties, check passes
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-13 13:10:49 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-09 16:38:37 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-10-24 11:01:53 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Compare the schema to the response
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										required . forEach ( ( prop )  =>  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( schema . hasOwnProperty ( prop ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-03 23:59:08 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												assert ( response . hasOwnProperty ( prop ) ,  ` " ${ prop } " is a required property (path:  ${ method }   ${ path } , context:  ${ context } ) ` ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-24 11:01:53 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// Don't proceed with type-check if the value could possibly be unset (nullable: true, in spec)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( response [ prop ]  ===  null  &&  schema [ prop ] . nullable  ===  true )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// Therefore, if the value is actually null, that's a problem (nullable is probably missing)
 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-03 23:59:08 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												assert ( response [ prop ]  !==  null ,  ` " ${ prop } " was null, but schema does not specify it to be a nullable property (path:  ${ method }   ${ path } , context:  ${ context } ) ` ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-24 11:01:53 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												switch  ( schema [ prop ] . type )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													case  'string' : 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-03 23:59:08 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														assert . strictEqual ( typeof  response [ prop ] ,  'string' ,  ` " ${ prop } " was expected to be a string, but was  ${ typeof  response [ prop ] }  instead (path:  ${ method }   ${ path } , context:  ${ context } ) ` ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-24 11:01:53 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													case  'boolean' : 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-03 23:59:08 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														assert . strictEqual ( typeof  response [ prop ] ,  'boolean' ,  ` " ${ prop } " was expected to be a boolean, but was  ${ typeof  response [ prop ] }  instead (path:  ${ method }   ${ path } , context:  ${ context } ) ` ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-24 11:01:53 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													case  'object' : 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-03 23:59:08 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														assert . strictEqual ( typeof  response [ prop ] ,  'object' ,  ` " ${ prop } " was expected to be an object, but was  ${ typeof  response [ prop ] }  instead (path:  ${ method }   ${ path } , context:  ${ context } ) ` ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-26 21:51:25 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														compare ( schema [ prop ] ,  response [ prop ] ,  method ,  path ,  context  ?  [ context ,  prop ] . join ( '.' )  :  prop ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-24 11:01:53 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													case  'array' : 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-03 23:59:08 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														assert . strictEqual ( Array . isArray ( response [ prop ] ) ,  true ,  ` " ${ prop } " was expected to be an array, but was  ${ typeof  response [ prop ] }  instead (path:  ${ method }   ${ path } , context:  ${ context } ) ` ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-24 11:01:53 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														if  ( schema [ prop ] . items )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-27 14:38:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															// Ensure the array items have a schema defined
 
							 
						 
					
						
							
								
									
										
											 
										
											
												Bootstrap5 (#10894)
* chore: up deps
* chore: up composer
* fix(deps): bump 2factor to v7
* chore: up harmony
* chore: up harmony
* fix: missing await
* feat: allow middlewares to pass in template values via res.locals
* feat: buildAccountData middleware automatically added ot all account routes
* fix: properly allow values in res.locals.templateValues to be added to the template data
* refactor: user/blocks
* refactor(accounts): categories and consent
* feat: automatically 404 if exposeUid or exposeGroupName come up empty
* refactor: remove calls to getUserDataByUserSlug for most account routes, since it is populated via middleware now
* fix: allow exposeUid and exposeGroupName to work with slugs with mixed capitalization
* fix: move reputation removal check to accountHelpers method
* test: skip i18n tests if ref branch when present is not develop
* fix(deps): bump theme versions
* fix(deps): bump ntfy and 2factor
* chore: up harmony
* fix: add missing return
* fix: #11191, only focus on search input on md environments and up
* feat: allow file uploads on mobile chat
closes https://github.com/NodeBB/NodeBB/issues/11217
* chore: up themes
* chore: add lang string
* fix(deps): bump ntfy to 1.0.15
* refactor: use new if/each syntax
* chore: up composer
* fix: regression from user helper refactor
* chore: up harmony
* chore: up composer
* chore: up harmony
* chore: up harmony
* chore: up harmony
* chore: fix composer version
* feat: add increment helper
* chore: up harmony
* fix: #11228 no timestamps in future :hourglass:
* chore: up harmony
* check config.theme as well
fire action:posts.loaded after processing dom
* chore: up harmony
* chore: up harmony
* chore: up harmony
* chore: up themes
* chore: up harmony
* remove extra class
* refactor: move these to core from harmony
* chore: up widgets
* chore: up widgets
* height auto
* fix: closes #11238
* dont focus inputs, annoying on mobile
* fix: dont focus twice, only focus on chat input on desktop
dont wrap widget footer in row
* chore: up harmony
* chore: up harmony
* update chat window
* chore: up themes
* fix cache buster for skins
* chat fixes
* chore: up harmony
* chore: up composer
* refactor: change hook logs to debug
* fix: scroll to post right after adding to dom
* fix: hash scrolling and highlighting correct post
* test: re-enable read API schema tests
* fix: add back schema changes for 179faa2270f2ad955dcc4a7b04755acce59e6ffd and c3920ccb10d8ead2dcd9914bb1784bed3f6adfd4
* fix: schema changes from 488f0978a4aa1ca1e4d2a1f2e8c7ef7a681f2f27
* fix: schema changes for f4cf482a874701ce80c0f306c49d8788cec66f87
* fix: schema update for be6bbabd0e2551fbe9571dcf3ee40ad721764543
* fix: schema changes for 69c96078ea78ee2c45885a90a6f6a59f9042a33c
* fix: schema changes for d1364c313021e48a879a818b24947e1457c062f7
* fix: schema changes for 84ff1152f7552dd866e25a90972d970b9861107e
* fix: schema changes for b860c2605c209e0650ef98f4c80d842ea23a51ce
* fix: schema changes for 23cb67a1126481848fac39aafd1e253441e76d7f
* fix: schema changes for b916e42f400dac8aa51670b15e439f87f0eb8939
* fix: schema change for a9bbb586fcb3a1c61b5fb69052236e78cdf7d743
* fix: schema changes for 4b738c8cd36c936a1dbe2bb900c694bf6c5520ec
* fix: schema changes for 58b5781cea9acb129e6604a82ab5a5bfc0d8394d
* fix: schema changes for 794bf01b21709c4be06584d576d706b3d6342057
* fix: schema changes for 80ea12c1c1963f5b39fb64841e4f3c8da3c87af2, e368feef51e0766f119c9710fb4db8f64724725c, and 52ead114bec961c62fa2eb0786540e229f6e4873
* fix: composer-default object in config?
* fix: schema changes for 9acdc6808c070555352951c651921df181b10993 and 093093420027999df3c67bf0ea6024f6dbf81d2d
* fix: schema changes for c0a52924f1f7ef8caeaacda67363ac269b56042c
* fix: schema change for aba420a3f3b774e949c2539c73f3dc0e1ae79a38, move loggedInUser to optional props
* fix: schema changes for 8c67031609da30d788561459f8bb76e9a69253de
* fix: schema changes for 27e53b42f3ce48fa61d3754375715cd41ffe808d
* fix: schema changes for 28359665187b0a3b9ec6226dca1234ebdbd725a5
* fix: breaking test for email confirmation API call
* fix: schema changes for refactored search page
* fix: schema changes for user object
* fix: schema changes for 9f531f957e08eabb4bae844ddd67bde14d9b59f0
* fix: schema changes for c4042c70decd628e5b880bd109515b47e4e16164 and 23175110a29640e6fa052db1079bfedb34a61055
* fix: schema changes for 9b3616b10392e247974eb0c1e6225a1582bf6c69
* fix: schema changes for 5afd5de07d42fd33f039a6f85ded3b4992200e5a
* fix: schema change for 1d7baf12171cffbd3af8914bef4e6297d1160d49
* fix: schema changes for 57bfb37c55a839662144e684875003ab52315ecc and be6bbabd0e2551fbe9571dcf3ee40ad721764543
* fix: schema changes for 6e86b4afa20d662af8b9f1c07518df2d8c258105 and 3efad2e13b7319eb9a1f4fda7af047be43ebc11f and 68f66223e73a72f378f193c83a9b5546bede2cda
* fix: allowing optional qs prop in pagination keys (not sure why this didn't break before)
* fix: re-login on email change
* fix: schema changes for c926358d734a2fa410de87f4e4a91744215fc14a
* fix: schema changes for 388a8270c9882892bad5c8141f65da8d59eac0fd
* fix: schema change for 2658bcc821c22e137a6eeb9bb74098856a642eaf
* fix: no need to call account middlewares for chats routes
* fix: schema changes for 71743affc3e58dc85d4ffa15ce043d4d9ddd3d67
* fix: final schema changes
* test: support for anyOf and oneOf
* fix: check thumb
* dont scroll to top on back press
* remove group log
* fix: add top margin to merged and deleted alerts
* chore: up widgets
* fix: improve fix-lists mixin
* chore: up harmony/composer
* feat: allow hiding quicksearch results during search
* dont record searches made by composer
* chore: up 54
* chore: up spam be gone
* feat: add prev/next page and page count into mobile paginator
* chore: up harmony
* chore: up harmony
* use old style for IS
* fix: hide entire toolbar row if no posts or not singlePost
* fix: updated messaging for post-queue template, #11206
* fix: btn-sm on post queue back button
* fix: bump harmony, closes #11206
* fix: remove unused alert module import
* fix: bump harmony
* fix: bump harmony
* chore: up harmony
* refactor: IS scrolltop
* fix: update users:search-user-for-chat source string
* feat: support for mark-read toggle on chats dropdown and recent chats list
* feat: api v3 calls to mark chat read/unread
* feat: send event:chats.mark socket event on mark read or unread
* refactor: allow frontend to mark chats as unread, use new API v3 routes instead of socket calls, better frontend event handling
* docs: openapi schema updates for chat marking
* fix: allow unread state toggling in chats dropdown too
* fix: issue where repeated openings of the chats dropdown would continually add events for mark-read/unread
* fix: debug log
* refactor: move userSearch filter to a module
* feat(routes): allow remounting /categories (#11230)
* feat: send flags count to frontend on flags list page
* refactor: filter form client-side js to extract out some logic
* fix: applyFilters to not take any arguments, update selectedCids in updateButton instead of onHidden
* fix: use userFilter module for assignee, reporterId, targetUid
* fix(openapi): schema changes for updated flags page
* fix: dont allow adding duplicates to userFilter
* use same var
* remove log
* fix: closes #11282
* feat: lang key for x-topics
* chore: up harmony
* chore: up emoji
* chore: up harmony
* fix: update userFilter to allow new option `selectedBlock`
* fix: wrong block name passed to userFilter
* fix: https://github.com/NodeBB/NodeBB/issues/11283
* fix: chats, allow multiple dropdowns like in harmony
* chore: up harmony
* refactor: flag note adding/editing, closes #11285
* fix: remove old prepareEdit logic
* chore: add caveat about hacky code block in userFilter module
* fix: placeholders for userFilter module
* refactor: navigator so it works with multiple thumbs/navigators
* chore: up harmony
* fix: closes #11287, destroy quick reply autocomplete
on navigation
* fix: filter disabled categories on user categories page count
* chore: up harmony
* docs: update openapi spec to include info about passing in timestamps for topic creation, removing timestamp as valid request param for topic replying
* fix: send back null values on ACP search dashboard for startDate and endDate if not expicitly passed in, fix tests
* fix: tweak table order in ACP dash searches
* fix: only invoke navigator click drag on left mouse button
* feat: add back unread indicator to navigator
* clear bookmark on mark unread
* fix: navigator crash on ajaxify
* better thumb top calculation
* fix: reset user bookmark when topic is marked unread
* Revert "fix: reset user bookmark when topic is marked unread"
This reverts commit 9bcd85c2c6848c3d325d32027261809da6e11c9e.
* fix: update unread indicator on scroll, add unread count
* chore: bump harmony
* fix: crash on navigator unread update when backing out of a topic
* fix: closes #11183
* fix: update topics:recent zset when rescheduling a topic
* fix: dupe quote button, increase delay, hide immediately on empty selection
* fix: navigator not showing up on first load
* refactor: remove glance
assorted fixes to navigator
dont reduce remaning count if user scrolls down and up quickly
only call topic.navigatorCallback when index changes
* more sanity checks for bookmark
dont allow setting bookmark higher than topic postcount
* closes #11218, :train:
* Revert "fix: update topics:recent zset when rescheduling a topic"
This reverts commit 737973cca9e94b6cb3867492a09e1e0b1af391d5.
* fix: #11306, show proper error if queued post doesn't exist
was showing no-privileges if someone else accepted the post
* https://github.com/NodeBB/NodeBB/issues/11307
dont use li
* chore: up harmony
* chore: bump version string
* fix: copy paste fail
* feat: closes #7382, tag filtering
add client side support for filtering by tags on /category, /recent and /unread
* chore: up harmony
* chore: up harmony
* Revert "fix: add back req.query fallback for backwards compatibility" [breaking]
This reverts commit cf6cc2c454dc35c330393c62ee8ce67b42d8eefb.
This commit is no longer required as passing in a CSRF token via query parameter is no longer supported as of NodeBB v3.x
This is a breaking change.
* fix: pass csrf token in form data, re: NodeBB/NodeBB#11309
* chore: up deps
* fix: tests, use x-csrf-token query param removed
* test: fix csrf_token
* lint: remove unused
* feat: add itemprop="image" to avatar helper
* fix: get chat upload button in chat modal
* breaking: remove deprecated socket.io methods
* test: update messaging tests to not use sockets
* fix: parent post links
* fix: prevent post tooltip if mouse leaves before data/tpl is loaded
* chore: up harmony
* chore: up harmony
* chore: up harmony
* chore: up harmony
* fix: nested replies indices
* fix(deps): bump 2factor
* feat: add loggedIn user to all api routes
* chore: up themes
* refactor: audit admin v3 write api routes as per #11321
* refactor: audit category v3 write api routes as per #11321 [breaking]
docs: fix open api spec for #11321
* refactor: audit chat v3 write api routes as per #11321
* refactor: audit files v3 write api routes as per #11321
* refactor: audit flags v3 write api routes as per #11321
* refactor: audit posts v3 write api routes as per #11321
* refactor: audit topics v3 write api routes as per #11321
* refactor: audit users v3 write api routes as per #11321
* fix: lang string
* remove min height
* fix: empty topic/labels taking up space
* fix: tag filtering when changing filter to watched topics
or changing popular time limit to month
* chore: up harmony
* fix: closes #11354, show no post error if queued post already accepted/rejected
* test: #11354
* test: #11354
* fix(deps): bump 2factor
* fix: #11357 clear cache on thumb remove
* fix: thumb remove on windows, closes #11357
* test: openapi for thumbs
* test: fix openapi
---------
Co-authored-by: Julian Lam <julian@nodebb.org>
Co-authored-by: Opliko <opliko.reg@protonmail.com>
											 
										 
										
											2023-03-17 11:58:31 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															assert ( schema [ prop ] . items . type  ||  schema [ prop ] . items . allOf  ||  schema [ prop ] . items . anyOf  ||  schema [ prop ] . items . oneOf ,  ` " ${ prop } " is defined to be an array, but its items have no schema defined (path:  ${ method }   ${ path } , context:  ${ context } ) ` ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-24 11:01:53 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															// Compare types
 
							 
						 
					
						
							
								
									
										
											 
										
											
												Bootstrap5 (#10894)
* chore: up deps
* chore: up composer
* fix(deps): bump 2factor to v7
* chore: up harmony
* chore: up harmony
* fix: missing await
* feat: allow middlewares to pass in template values via res.locals
* feat: buildAccountData middleware automatically added ot all account routes
* fix: properly allow values in res.locals.templateValues to be added to the template data
* refactor: user/blocks
* refactor(accounts): categories and consent
* feat: automatically 404 if exposeUid or exposeGroupName come up empty
* refactor: remove calls to getUserDataByUserSlug for most account routes, since it is populated via middleware now
* fix: allow exposeUid and exposeGroupName to work with slugs with mixed capitalization
* fix: move reputation removal check to accountHelpers method
* test: skip i18n tests if ref branch when present is not develop
* fix(deps): bump theme versions
* fix(deps): bump ntfy and 2factor
* chore: up harmony
* fix: add missing return
* fix: #11191, only focus on search input on md environments and up
* feat: allow file uploads on mobile chat
closes https://github.com/NodeBB/NodeBB/issues/11217
* chore: up themes
* chore: add lang string
* fix(deps): bump ntfy to 1.0.15
* refactor: use new if/each syntax
* chore: up composer
* fix: regression from user helper refactor
* chore: up harmony
* chore: up composer
* chore: up harmony
* chore: up harmony
* chore: up harmony
* chore: fix composer version
* feat: add increment helper
* chore: up harmony
* fix: #11228 no timestamps in future :hourglass:
* chore: up harmony
* check config.theme as well
fire action:posts.loaded after processing dom
* chore: up harmony
* chore: up harmony
* chore: up harmony
* chore: up themes
* chore: up harmony
* remove extra class
* refactor: move these to core from harmony
* chore: up widgets
* chore: up widgets
* height auto
* fix: closes #11238
* dont focus inputs, annoying on mobile
* fix: dont focus twice, only focus on chat input on desktop
dont wrap widget footer in row
* chore: up harmony
* chore: up harmony
* update chat window
* chore: up themes
* fix cache buster for skins
* chat fixes
* chore: up harmony
* chore: up composer
* refactor: change hook logs to debug
* fix: scroll to post right after adding to dom
* fix: hash scrolling and highlighting correct post
* test: re-enable read API schema tests
* fix: add back schema changes for 179faa2270f2ad955dcc4a7b04755acce59e6ffd and c3920ccb10d8ead2dcd9914bb1784bed3f6adfd4
* fix: schema changes from 488f0978a4aa1ca1e4d2a1f2e8c7ef7a681f2f27
* fix: schema changes for f4cf482a874701ce80c0f306c49d8788cec66f87
* fix: schema update for be6bbabd0e2551fbe9571dcf3ee40ad721764543
* fix: schema changes for 69c96078ea78ee2c45885a90a6f6a59f9042a33c
* fix: schema changes for d1364c313021e48a879a818b24947e1457c062f7
* fix: schema changes for 84ff1152f7552dd866e25a90972d970b9861107e
* fix: schema changes for b860c2605c209e0650ef98f4c80d842ea23a51ce
* fix: schema changes for 23cb67a1126481848fac39aafd1e253441e76d7f
* fix: schema changes for b916e42f400dac8aa51670b15e439f87f0eb8939
* fix: schema change for a9bbb586fcb3a1c61b5fb69052236e78cdf7d743
* fix: schema changes for 4b738c8cd36c936a1dbe2bb900c694bf6c5520ec
* fix: schema changes for 58b5781cea9acb129e6604a82ab5a5bfc0d8394d
* fix: schema changes for 794bf01b21709c4be06584d576d706b3d6342057
* fix: schema changes for 80ea12c1c1963f5b39fb64841e4f3c8da3c87af2, e368feef51e0766f119c9710fb4db8f64724725c, and 52ead114bec961c62fa2eb0786540e229f6e4873
* fix: composer-default object in config?
* fix: schema changes for 9acdc6808c070555352951c651921df181b10993 and 093093420027999df3c67bf0ea6024f6dbf81d2d
* fix: schema changes for c0a52924f1f7ef8caeaacda67363ac269b56042c
* fix: schema change for aba420a3f3b774e949c2539c73f3dc0e1ae79a38, move loggedInUser to optional props
* fix: schema changes for 8c67031609da30d788561459f8bb76e9a69253de
* fix: schema changes for 27e53b42f3ce48fa61d3754375715cd41ffe808d
* fix: schema changes for 28359665187b0a3b9ec6226dca1234ebdbd725a5
* fix: breaking test for email confirmation API call
* fix: schema changes for refactored search page
* fix: schema changes for user object
* fix: schema changes for 9f531f957e08eabb4bae844ddd67bde14d9b59f0
* fix: schema changes for c4042c70decd628e5b880bd109515b47e4e16164 and 23175110a29640e6fa052db1079bfedb34a61055
* fix: schema changes for 9b3616b10392e247974eb0c1e6225a1582bf6c69
* fix: schema changes for 5afd5de07d42fd33f039a6f85ded3b4992200e5a
* fix: schema change for 1d7baf12171cffbd3af8914bef4e6297d1160d49
* fix: schema changes for 57bfb37c55a839662144e684875003ab52315ecc and be6bbabd0e2551fbe9571dcf3ee40ad721764543
* fix: schema changes for 6e86b4afa20d662af8b9f1c07518df2d8c258105 and 3efad2e13b7319eb9a1f4fda7af047be43ebc11f and 68f66223e73a72f378f193c83a9b5546bede2cda
* fix: allowing optional qs prop in pagination keys (not sure why this didn't break before)
* fix: re-login on email change
* fix: schema changes for c926358d734a2fa410de87f4e4a91744215fc14a
* fix: schema changes for 388a8270c9882892bad5c8141f65da8d59eac0fd
* fix: schema change for 2658bcc821c22e137a6eeb9bb74098856a642eaf
* fix: no need to call account middlewares for chats routes
* fix: schema changes for 71743affc3e58dc85d4ffa15ce043d4d9ddd3d67
* fix: final schema changes
* test: support for anyOf and oneOf
* fix: check thumb
* dont scroll to top on back press
* remove group log
* fix: add top margin to merged and deleted alerts
* chore: up widgets
* fix: improve fix-lists mixin
* chore: up harmony/composer
* feat: allow hiding quicksearch results during search
* dont record searches made by composer
* chore: up 54
* chore: up spam be gone
* feat: add prev/next page and page count into mobile paginator
* chore: up harmony
* chore: up harmony
* use old style for IS
* fix: hide entire toolbar row if no posts or not singlePost
* fix: updated messaging for post-queue template, #11206
* fix: btn-sm on post queue back button
* fix: bump harmony, closes #11206
* fix: remove unused alert module import
* fix: bump harmony
* fix: bump harmony
* chore: up harmony
* refactor: IS scrolltop
* fix: update users:search-user-for-chat source string
* feat: support for mark-read toggle on chats dropdown and recent chats list
* feat: api v3 calls to mark chat read/unread
* feat: send event:chats.mark socket event on mark read or unread
* refactor: allow frontend to mark chats as unread, use new API v3 routes instead of socket calls, better frontend event handling
* docs: openapi schema updates for chat marking
* fix: allow unread state toggling in chats dropdown too
* fix: issue where repeated openings of the chats dropdown would continually add events for mark-read/unread
* fix: debug log
* refactor: move userSearch filter to a module
* feat(routes): allow remounting /categories (#11230)
* feat: send flags count to frontend on flags list page
* refactor: filter form client-side js to extract out some logic
* fix: applyFilters to not take any arguments, update selectedCids in updateButton instead of onHidden
* fix: use userFilter module for assignee, reporterId, targetUid
* fix(openapi): schema changes for updated flags page
* fix: dont allow adding duplicates to userFilter
* use same var
* remove log
* fix: closes #11282
* feat: lang key for x-topics
* chore: up harmony
* chore: up emoji
* chore: up harmony
* fix: update userFilter to allow new option `selectedBlock`
* fix: wrong block name passed to userFilter
* fix: https://github.com/NodeBB/NodeBB/issues/11283
* fix: chats, allow multiple dropdowns like in harmony
* chore: up harmony
* refactor: flag note adding/editing, closes #11285
* fix: remove old prepareEdit logic
* chore: add caveat about hacky code block in userFilter module
* fix: placeholders for userFilter module
* refactor: navigator so it works with multiple thumbs/navigators
* chore: up harmony
* fix: closes #11287, destroy quick reply autocomplete
on navigation
* fix: filter disabled categories on user categories page count
* chore: up harmony
* docs: update openapi spec to include info about passing in timestamps for topic creation, removing timestamp as valid request param for topic replying
* fix: send back null values on ACP search dashboard for startDate and endDate if not expicitly passed in, fix tests
* fix: tweak table order in ACP dash searches
* fix: only invoke navigator click drag on left mouse button
* feat: add back unread indicator to navigator
* clear bookmark on mark unread
* fix: navigator crash on ajaxify
* better thumb top calculation
* fix: reset user bookmark when topic is marked unread
* Revert "fix: reset user bookmark when topic is marked unread"
This reverts commit 9bcd85c2c6848c3d325d32027261809da6e11c9e.
* fix: update unread indicator on scroll, add unread count
* chore: bump harmony
* fix: crash on navigator unread update when backing out of a topic
* fix: closes #11183
* fix: update topics:recent zset when rescheduling a topic
* fix: dupe quote button, increase delay, hide immediately on empty selection
* fix: navigator not showing up on first load
* refactor: remove glance
assorted fixes to navigator
dont reduce remaning count if user scrolls down and up quickly
only call topic.navigatorCallback when index changes
* more sanity checks for bookmark
dont allow setting bookmark higher than topic postcount
* closes #11218, :train:
* Revert "fix: update topics:recent zset when rescheduling a topic"
This reverts commit 737973cca9e94b6cb3867492a09e1e0b1af391d5.
* fix: #11306, show proper error if queued post doesn't exist
was showing no-privileges if someone else accepted the post
* https://github.com/NodeBB/NodeBB/issues/11307
dont use li
* chore: up harmony
* chore: bump version string
* fix: copy paste fail
* feat: closes #7382, tag filtering
add client side support for filtering by tags on /category, /recent and /unread
* chore: up harmony
* chore: up harmony
* Revert "fix: add back req.query fallback for backwards compatibility" [breaking]
This reverts commit cf6cc2c454dc35c330393c62ee8ce67b42d8eefb.
This commit is no longer required as passing in a CSRF token via query parameter is no longer supported as of NodeBB v3.x
This is a breaking change.
* fix: pass csrf token in form data, re: NodeBB/NodeBB#11309
* chore: up deps
* fix: tests, use x-csrf-token query param removed
* test: fix csrf_token
* lint: remove unused
* feat: add itemprop="image" to avatar helper
* fix: get chat upload button in chat modal
* breaking: remove deprecated socket.io methods
* test: update messaging tests to not use sockets
* fix: parent post links
* fix: prevent post tooltip if mouse leaves before data/tpl is loaded
* chore: up harmony
* chore: up harmony
* chore: up harmony
* chore: up harmony
* fix: nested replies indices
* fix(deps): bump 2factor
* feat: add loggedIn user to all api routes
* chore: up themes
* refactor: audit admin v3 write api routes as per #11321
* refactor: audit category v3 write api routes as per #11321 [breaking]
docs: fix open api spec for #11321
* refactor: audit chat v3 write api routes as per #11321
* refactor: audit files v3 write api routes as per #11321
* refactor: audit flags v3 write api routes as per #11321
* refactor: audit posts v3 write api routes as per #11321
* refactor: audit topics v3 write api routes as per #11321
* refactor: audit users v3 write api routes as per #11321
* fix: lang string
* remove min height
* fix: empty topic/labels taking up space
* fix: tag filtering when changing filter to watched topics
or changing popular time limit to month
* chore: up harmony
* fix: closes #11354, show no post error if queued post already accepted/rejected
* test: #11354
* test: #11354
* fix(deps): bump 2factor
* fix: #11357 clear cache on thumb remove
* fix: thumb remove on windows, closes #11357
* test: openapi for thumbs
* test: fix openapi
---------
Co-authored-by: Julian Lam <julian@nodebb.org>
Co-authored-by: Opliko <opliko.reg@protonmail.com>
											 
										 
										
											2023-03-17 11:58:31 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															if  ( schema [ prop ] . items . type  ===  'object'  ||  Array . isArray ( schema [ prop ] . items . allOf  ||  schema [ prop ] . items . anyOf  ||  schema [ prop ] . items . oneOf ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-24 11:01:53 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																response [ prop ] . forEach ( ( res )  =>  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-26 21:51:25 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																	compare ( schema [ prop ] . items ,  res ,  method ,  path ,  context  ?  [ context ,  prop ] . join ( '.' )  :  prop ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-24 11:01:53 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															}  else  if  ( response [ prop ] . length )  {  // for now
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																response [ prop ] . forEach ( ( item )  =>  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-03 23:59:08 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																	assert . strictEqual ( typeof  item ,  schema [ prop ] . items . type ,  ` " ${ prop } " should have  ${ schema [ prop ] . items . type }  items, but found  ${ typeof  items }  instead (path:  ${ method }   ${ path } , context:  ${ context } ) ` ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-24 11:01:53 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Compare the response to the schema
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Object . keys ( response ) . forEach ( ( prop )  =>  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-18 16:42:18 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( additionalProperties )  {  // All bets are off
 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-24 11:01:53 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-02-03 23:59:08 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											assert ( schema [ prop ] ,  ` " ${ prop } " was found in response, but is not defined in schema (path:  ${ method }   ${ path } , context:  ${ context } ) ` ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-24 11:01:53 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-16 20:38:40 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								} ) ;