👌 IMPROVE: Custom express server - NextJS website
This commit is contained in:
		
							
								
								
									
										215
									
								
								website/package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										215
									
								
								website/package-lock.json
									
									
									
										generated
									
									
									
								
							| @@ -1794,6 +1794,11 @@ | ||||
|       "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", | ||||
|       "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" | ||||
|     }, | ||||
|     "array-flatten": { | ||||
|       "version": "1.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", | ||||
|       "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" | ||||
|     }, | ||||
|     "array-union": { | ||||
|       "version": "1.0.2", | ||||
|       "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", | ||||
| @@ -2189,6 +2194,38 @@ | ||||
|       "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", | ||||
|       "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" | ||||
|     }, | ||||
|     "body-parser": { | ||||
|       "version": "1.19.0", | ||||
|       "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", | ||||
|       "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", | ||||
|       "requires": { | ||||
|         "bytes": "3.1.0", | ||||
|         "content-type": "~1.0.4", | ||||
|         "debug": "2.6.9", | ||||
|         "depd": "~1.1.2", | ||||
|         "http-errors": "1.7.2", | ||||
|         "iconv-lite": "0.4.24", | ||||
|         "on-finished": "~2.3.0", | ||||
|         "qs": "6.7.0", | ||||
|         "raw-body": "2.4.0", | ||||
|         "type-is": "~1.6.17" | ||||
|       }, | ||||
|       "dependencies": { | ||||
|         "bytes": { | ||||
|           "version": "3.1.0", | ||||
|           "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", | ||||
|           "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" | ||||
|         }, | ||||
|         "debug": { | ||||
|           "version": "2.6.9", | ||||
|           "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", | ||||
|           "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", | ||||
|           "requires": { | ||||
|             "ms": "2.0.0" | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "brace-expansion": { | ||||
|       "version": "1.1.11", | ||||
|       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", | ||||
| @@ -2808,6 +2845,21 @@ | ||||
|       "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", | ||||
|       "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" | ||||
|     }, | ||||
|     "content-disposition": { | ||||
|       "version": "0.5.3", | ||||
|       "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", | ||||
|       "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", | ||||
|       "requires": { | ||||
|         "safe-buffer": "5.1.2" | ||||
|       }, | ||||
|       "dependencies": { | ||||
|         "safe-buffer": { | ||||
|           "version": "5.1.2", | ||||
|           "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", | ||||
|           "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "content-type": { | ||||
|       "version": "1.0.4", | ||||
|       "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", | ||||
| @@ -2833,6 +2885,11 @@ | ||||
|       "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", | ||||
|       "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" | ||||
|     }, | ||||
|     "cookie-signature": { | ||||
|       "version": "1.0.6", | ||||
|       "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", | ||||
|       "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" | ||||
|     }, | ||||
|     "copy-concurrently": { | ||||
|       "version": "1.0.5", | ||||
|       "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", | ||||
| @@ -3864,6 +3921,71 @@ | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "express": { | ||||
|       "version": "4.17.1", | ||||
|       "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", | ||||
|       "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", | ||||
|       "requires": { | ||||
|         "accepts": "~1.3.7", | ||||
|         "array-flatten": "1.1.1", | ||||
|         "body-parser": "1.19.0", | ||||
|         "content-disposition": "0.5.3", | ||||
|         "content-type": "~1.0.4", | ||||
|         "cookie": "0.4.0", | ||||
|         "cookie-signature": "1.0.6", | ||||
|         "debug": "2.6.9", | ||||
|         "depd": "~1.1.2", | ||||
|         "encodeurl": "~1.0.2", | ||||
|         "escape-html": "~1.0.3", | ||||
|         "etag": "~1.8.1", | ||||
|         "finalhandler": "~1.1.2", | ||||
|         "fresh": "0.5.2", | ||||
|         "merge-descriptors": "1.0.1", | ||||
|         "methods": "~1.1.2", | ||||
|         "on-finished": "~2.3.0", | ||||
|         "parseurl": "~1.3.3", | ||||
|         "path-to-regexp": "0.1.7", | ||||
|         "proxy-addr": "~2.0.5", | ||||
|         "qs": "6.7.0", | ||||
|         "range-parser": "~1.2.1", | ||||
|         "safe-buffer": "5.1.2", | ||||
|         "send": "0.17.1", | ||||
|         "serve-static": "1.14.1", | ||||
|         "setprototypeof": "1.1.1", | ||||
|         "statuses": "~1.5.0", | ||||
|         "type-is": "~1.6.18", | ||||
|         "utils-merge": "1.0.1", | ||||
|         "vary": "~1.1.2" | ||||
|       }, | ||||
|       "dependencies": { | ||||
|         "debug": { | ||||
|           "version": "2.6.9", | ||||
|           "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", | ||||
|           "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", | ||||
|           "requires": { | ||||
|             "ms": "2.0.0" | ||||
|           } | ||||
|         }, | ||||
|         "path-to-regexp": { | ||||
|           "version": "0.1.7", | ||||
|           "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", | ||||
|           "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" | ||||
|         }, | ||||
|         "safe-buffer": { | ||||
|           "version": "5.1.2", | ||||
|           "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", | ||||
|           "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "express-http-to-https": { | ||||
|       "version": "1.1.4", | ||||
|       "resolved": "https://registry.npmjs.org/express-http-to-https/-/express-http-to-https-1.1.4.tgz", | ||||
|       "integrity": "sha512-jPe7xNKz+KdTYn0uJSBPug/AE5hCIgYrXed0SsmCm5TyydxeSK/U3sVyJyMaQmluJcIS+sbq6E/iB4CBZQIN1g==", | ||||
|       "requires": { | ||||
|         "express": "^4.15.3" | ||||
|       } | ||||
|     }, | ||||
|     "ext": { | ||||
|       "version": "1.4.0", | ||||
|       "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", | ||||
| @@ -4023,6 +4145,30 @@ | ||||
|         "to-regex-range": "^5.0.1" | ||||
|       } | ||||
|     }, | ||||
|     "finalhandler": { | ||||
|       "version": "1.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", | ||||
|       "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", | ||||
|       "requires": { | ||||
|         "debug": "2.6.9", | ||||
|         "encodeurl": "~1.0.2", | ||||
|         "escape-html": "~1.0.3", | ||||
|         "on-finished": "~2.3.0", | ||||
|         "parseurl": "~1.3.3", | ||||
|         "statuses": "~1.5.0", | ||||
|         "unpipe": "~1.0.0" | ||||
|       }, | ||||
|       "dependencies": { | ||||
|         "debug": { | ||||
|           "version": "2.6.9", | ||||
|           "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", | ||||
|           "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", | ||||
|           "requires": { | ||||
|             "ms": "2.0.0" | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "finally-polyfill": { | ||||
|       "version": "0.1.0", | ||||
|       "resolved": "https://registry.npmjs.org/finally-polyfill/-/finally-polyfill-0.1.0.tgz", | ||||
| @@ -4150,6 +4296,11 @@ | ||||
|       "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", | ||||
|       "integrity": "sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=" | ||||
|     }, | ||||
|     "forwarded": { | ||||
|       "version": "0.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", | ||||
|       "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" | ||||
|     }, | ||||
|     "fragment-cache": { | ||||
|       "version": "0.2.1", | ||||
|       "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", | ||||
| @@ -4702,6 +4853,11 @@ | ||||
|         "loose-envify": "^1.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "ipaddr.js": { | ||||
|       "version": "1.9.1", | ||||
|       "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", | ||||
|       "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" | ||||
|     }, | ||||
|     "is-accessor-descriptor": { | ||||
|       "version": "0.1.6", | ||||
|       "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", | ||||
| @@ -5334,6 +5490,11 @@ | ||||
|         "unist-util-visit-parents": "1.1.2" | ||||
|       } | ||||
|     }, | ||||
|     "media-typer": { | ||||
|       "version": "0.3.0", | ||||
|       "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", | ||||
|       "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" | ||||
|     }, | ||||
|     "memory-fs": { | ||||
|       "version": "0.4.1", | ||||
|       "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", | ||||
| @@ -5372,11 +5533,21 @@ | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "merge-descriptors": { | ||||
|       "version": "1.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", | ||||
|       "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" | ||||
|     }, | ||||
|     "merge-stream": { | ||||
|       "version": "2.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", | ||||
|       "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" | ||||
|     }, | ||||
|     "methods": { | ||||
|       "version": "1.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", | ||||
|       "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" | ||||
|     }, | ||||
|     "microevent.ts": { | ||||
|       "version": "0.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz", | ||||
| @@ -6461,6 +6632,11 @@ | ||||
|         "json-parse-better-errors": "^1.0.1" | ||||
|       } | ||||
|     }, | ||||
|     "parseurl": { | ||||
|       "version": "1.3.3", | ||||
|       "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", | ||||
|       "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" | ||||
|     }, | ||||
|     "pascalcase": { | ||||
|       "version": "0.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", | ||||
| @@ -8704,6 +8880,15 @@ | ||||
|         "xtend": "^4.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "proxy-addr": { | ||||
|       "version": "2.0.6", | ||||
|       "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", | ||||
|       "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", | ||||
|       "requires": { | ||||
|         "forwarded": "~0.1.2", | ||||
|         "ipaddr.js": "1.9.1" | ||||
|       } | ||||
|     }, | ||||
|     "prr": { | ||||
|       "version": "1.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", | ||||
| @@ -8757,6 +8942,11 @@ | ||||
|       "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", | ||||
|       "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" | ||||
|     }, | ||||
|     "qs": { | ||||
|       "version": "6.7.0", | ||||
|       "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", | ||||
|       "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" | ||||
|     }, | ||||
|     "query-string": { | ||||
|       "version": "4.3.4", | ||||
|       "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", | ||||
| @@ -9516,6 +9706,17 @@ | ||||
|       "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", | ||||
|       "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==" | ||||
|     }, | ||||
|     "serve-static": { | ||||
|       "version": "1.14.1", | ||||
|       "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", | ||||
|       "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", | ||||
|       "requires": { | ||||
|         "encodeurl": "~1.0.2", | ||||
|         "escape-html": "~1.0.3", | ||||
|         "parseurl": "~1.3.3", | ||||
|         "send": "0.17.1" | ||||
|       } | ||||
|     }, | ||||
|     "set-value": { | ||||
|       "version": "2.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", | ||||
| @@ -10364,6 +10565,15 @@ | ||||
|       "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", | ||||
|       "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" | ||||
|     }, | ||||
|     "type-is": { | ||||
|       "version": "1.6.18", | ||||
|       "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", | ||||
|       "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", | ||||
|       "requires": { | ||||
|         "media-typer": "0.3.0", | ||||
|         "mime-types": "~2.1.24" | ||||
|       } | ||||
|     }, | ||||
|     "typed-styles": { | ||||
|       "version": "0.0.7", | ||||
|       "resolved": "https://registry.npmjs.org/typed-styles/-/typed-styles-0.0.7.tgz", | ||||
| @@ -10639,6 +10849,11 @@ | ||||
|       "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", | ||||
|       "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" | ||||
|     }, | ||||
|     "utils-merge": { | ||||
|       "version": "1.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", | ||||
|       "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" | ||||
|     }, | ||||
|     "uuid": { | ||||
|       "version": "3.4.0", | ||||
|       "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", | ||||
|   | ||||
| @@ -19,6 +19,8 @@ | ||||
|     "axios": "^0.19.2", | ||||
|     "date-and-time": "^0.13.1", | ||||
|     "date-fns": "^2.12.0", | ||||
|     "express": "^4.17.1", | ||||
|     "express-http-to-https": "^1.1.4", | ||||
|     "html-react-parser": "^0.10.2", | ||||
|     "next": "9.3.2", | ||||
|     "next-fonts": "^1.0.3", | ||||
|   | ||||
| @@ -1,28 +1,28 @@ | ||||
| const { createServer } = require("http"); | ||||
| const { parse }        = require("url"); | ||||
| const next             = require("next"); | ||||
| /* Modules */ | ||||
| const next            = require('next'); | ||||
| const express         = require("express"); | ||||
| const redirectToHTTPS = require('express-http-to-https').redirectToHTTPS; | ||||
|  | ||||
| /* Variables */ | ||||
| const PORT   = process.env.PORT || 3000; | ||||
| const dev    = process.env.NODE_ENV !== "production"; | ||||
| const app    = next({ dev }); | ||||
| const handle = app.getRequestHandler(); | ||||
|  | ||||
| app.prepare().then(() => { | ||||
|     createServer((req, res) => { | ||||
|         // Be sure to pass `true` as the second argument to `url.parse`. | ||||
|         // This tells it to parse the query portion of the URL. | ||||
|         const parsedUrl = parse(req.url, true); | ||||
|         const { pathname, query } = parsedUrl; | ||||
|     const server = express(); | ||||
|  | ||||
|         if (pathname === "/a") { | ||||
|             app.render(req, res, "/b", query); | ||||
|         } else if (pathname === "/b") { | ||||
|             app.render(req, res, "/a", query); | ||||
|         } else { | ||||
|             handle(req, res, parsedUrl); | ||||
|         } | ||||
|     }).listen(PORT, (err) => { | ||||
|         if (err) throw err; | ||||
|     /* Middlewares */ | ||||
|     server.use(redirectToHTTPS([/localhost:(\d{4})/])); | ||||
|  | ||||
|     /* Routes */ | ||||
|     server.all("*", (req, res) => { | ||||
|         return handle(req, res); | ||||
|     }); | ||||
|  | ||||
|     /* Server */ | ||||
|     server.listen(PORT, (error) => { | ||||
|         if (error) throw error; | ||||
|         console.log(`> Ready on http://localhost:${PORT}`); | ||||
|     }); | ||||
| }); | ||||
		Reference in New Issue
	
	Block a user