✨ Better avatar and banner APIs
This commit is contained in:
		
							
								
								
									
										18
									
								
								.idea/workspace.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										18
									
								
								.idea/workspace.xml
									
									
									
										generated
									
									
									
								
							| @@ -4,8 +4,16 @@ | ||||
|     <option name="autoReloadType" value="ALL" /> | ||||
|   </component> | ||||
|   <component name="ChangeListManager"> | ||||
|     <list default="true" id="3fefb2c4-b6f9-466b-a523-53352e8d6f95" name="更改" comment=":arrow_up: Fix notification listen"> | ||||
|       <change beforePath="$PROJECT_DIR$/pkg/internal/models/accounts.go" beforeDir="false" afterPath="$PROJECT_DIR$/pkg/internal/models/accounts.go" afterDir="false" /> | ||||
|     <list default="true" id="3fefb2c4-b6f9-466b-a523-53352e8d6f95" name="更改" comment=":bug: Fix magic token's foreign key"> | ||||
|       <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> | ||||
|       <change beforePath="$PROJECT_DIR$/pkg/internal/server/api/avatar_api.go" beforeDir="false" afterPath="$PROJECT_DIR$/pkg/internal/server/api/avatar_api.go" afterDir="false" /> | ||||
|       <change beforePath="$PROJECT_DIR$/pkg/internal/server/api/index.go" beforeDir="false" afterPath="$PROJECT_DIR$/pkg/internal/server/api/index.go" afterDir="false" /> | ||||
|       <change beforePath="$PROJECT_DIR$/settings.toml" beforeDir="false" afterPath="$PROJECT_DIR$/settings.toml" afterDir="false" /> | ||||
|       <change beforePath="$PROJECT_DIR$/web/.gitignore" beforeDir="false" afterPath="$PROJECT_DIR$/web/.gitignore" afterDir="false" /> | ||||
|       <change beforePath="$PROJECT_DIR$/web/.vite/deps/_metadata.json" beforeDir="false" afterPath="$PROJECT_DIR$/web/.vite/deps/_metadata.json" afterDir="false" /> | ||||
|       <change beforePath="$PROJECT_DIR$/web/package.json" beforeDir="false" afterPath="$PROJECT_DIR$/web/package.json" afterDir="false" /> | ||||
|       <change beforePath="$PROJECT_DIR$/web/src/components/NotificationList.vue" beforeDir="false" afterPath="$PROJECT_DIR$/web/src/components/NotificationList.vue" afterDir="false" /> | ||||
|       <change beforePath="$PROJECT_DIR$/web/src/views/dashboard.vue" beforeDir="false" afterPath="$PROJECT_DIR$/web/src/views/dashboard.vue" afterDir="false" /> | ||||
|     </list> | ||||
|     <option name="SHOW_DIALOG" value="false" /> | ||||
|     <option name="HIGHLIGHT_CONFLICTS" value="true" /> | ||||
| @@ -59,7 +67,7 @@ | ||||
|     "nodejs_package_manager_path": "npm", | ||||
|     "run.code.analysis.last.selected.profile": "pProject Default", | ||||
|     "settings.editor.selected.configurable": "preferences.pluginManager", | ||||
|     "ts.external.directory.path": "/Users/littlesheep/Applications/GoLand.app/Contents/plugins/javascript-plugin/jsLanguageServicesImpl/external", | ||||
|     "ts.external.directory.path": "/Users/littlesheep/Documents/Projects/Hydrogen/Passport/web/node_modules/typescript/lib", | ||||
|     "vue.rearranger.settings.migration": "true" | ||||
|   }, | ||||
|   "keyToStringList": { | ||||
| @@ -143,7 +151,6 @@ | ||||
|     </option> | ||||
|   </component> | ||||
|   <component name="VcsManagerConfiguration"> | ||||
|     <MESSAGE value=":sparkles: Apple push notification services" /> | ||||
|     <MESSAGE value=":bug: Bug fix and fix" /> | ||||
|     <MESSAGE value=":bug: Fix APNs non-production" /> | ||||
|     <MESSAGE value=":bug: Bug fixes on notification badges for APNs" /> | ||||
| @@ -168,7 +175,8 @@ | ||||
|     <MESSAGE value=":sparkles: Recommend app component" /> | ||||
|     <MESSAGE value=":bug: Bug fixes" /> | ||||
|     <MESSAGE value=":arrow_up: Fix notification listen" /> | ||||
|     <option name="LAST_COMMIT_MESSAGE" value=":arrow_up: Fix notification listen" /> | ||||
|     <MESSAGE value=":bug: Fix magic token's foreign key" /> | ||||
|     <option name="LAST_COMMIT_MESSAGE" value=":bug: Fix magic token's foreign key" /> | ||||
|   </component> | ||||
|   <component name="VgoProject"> | ||||
|     <settings-migrated>true</settings-migrated> | ||||
|   | ||||
| @@ -19,10 +19,6 @@ func setAvatar(c *fiber.Ctx) error { | ||||
| 	} | ||||
| 	user := c.Locals("user").(models.Account) | ||||
|  | ||||
| 	if err := exts.EnsureAuthenticated(c); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	var data struct { | ||||
| 		AttachmentID uint `json:"attachment" validate:"required"` | ||||
| 	} | ||||
| @@ -88,3 +84,29 @@ func setBanner(c *fiber.Ctx) error { | ||||
|  | ||||
| 	return c.SendStatus(fiber.StatusOK) | ||||
| } | ||||
|  | ||||
| func getAvatar(c *fiber.Ctx) error { | ||||
| 	if err := exts.EnsureAuthenticated(c); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	user := c.Locals("user").(models.Account) | ||||
|  | ||||
| 	if content := user.GetAvatar(); content == nil { | ||||
| 		return c.SendStatus(fiber.StatusNotFound) | ||||
| 	} else { | ||||
| 		return c.Redirect(*content, fiber.StatusNotFound) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func getBanner(c *fiber.Ctx) error { | ||||
| 	if err := exts.EnsureAuthenticated(c); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	user := c.Locals("user").(models.Account) | ||||
|  | ||||
| 	if content := user.GetBanner(); content == nil { | ||||
| 		return c.SendStatus(fiber.StatusNotFound) | ||||
| 	} else { | ||||
| 		return c.Redirect(*content, fiber.StatusNotFound) | ||||
| 	} | ||||
| } | ||||
|   | ||||
| @@ -22,6 +22,8 @@ func MapAPIs(app *fiber.App) { | ||||
| 		me := api.Group("/users/me").Name("Myself Operations") | ||||
| 		{ | ||||
|  | ||||
| 			me.Get("/avatar", getAvatar) | ||||
| 			me.Get("/banner", getBanner) | ||||
| 			me.Put("/avatar", setAvatar) | ||||
| 			me.Put("/banner", setBanner) | ||||
|  | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| id = "passport01" | ||||
| name = "Solarpass" | ||||
|  | ||||
| frontend_app = "/passport/web" | ||||
| frontend_app = "web/dist" | ||||
|  | ||||
| bind = "0.0.0.0:8444" | ||||
| grpc_bind = "0.0.0.0:7444" | ||||
|   | ||||
							
								
								
									
										2
									
								
								web/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								web/.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -28,3 +28,5 @@ coverage | ||||
| *.sw? | ||||
|  | ||||
| *.tsbuildinfo | ||||
|  | ||||
| .vite | ||||
| @@ -1,8 +1,85 @@ | ||||
| { | ||||
|   "hash": "47c7bee8", | ||||
|   "hash": "8b6d0833", | ||||
|   "configHash": "9db2f33b", | ||||
|   "lockfileHash": "e3b0c442", | ||||
|   "browserHash": "0938dccf", | ||||
|   "optimized": {}, | ||||
|   "chunks": {} | ||||
|   "lockfileHash": "f7feab31", | ||||
|   "browserHash": "0decaeb8", | ||||
|   "optimized": { | ||||
|     "vue": { | ||||
|       "src": "../../node_modules/vue/dist/vue.runtime.esm-bundler.js", | ||||
|       "file": "vue.js", | ||||
|       "fileHash": "1913939b", | ||||
|       "needsInterop": false | ||||
|     }, | ||||
|     "pinia": { | ||||
|       "src": "../../node_modules/pinia/dist/pinia.mjs", | ||||
|       "file": "pinia.js", | ||||
|       "fileHash": "4c101c90", | ||||
|       "needsInterop": false | ||||
|     }, | ||||
|     "vuetify": { | ||||
|       "src": "../../node_modules/vuetify/lib/framework.mjs", | ||||
|       "file": "vuetify.js", | ||||
|       "fileHash": "3ab2542c", | ||||
|       "needsInterop": false | ||||
|     }, | ||||
|     "vuetify/blueprints": { | ||||
|       "src": "../../node_modules/vuetify/lib/blueprints/index.mjs", | ||||
|       "file": "vuetify_blueprints.js", | ||||
|       "fileHash": "b34fe63c", | ||||
|       "needsInterop": false | ||||
|     }, | ||||
|     "vuetify/components": { | ||||
|       "src": "../../node_modules/vuetify/lib/components/index.mjs", | ||||
|       "file": "vuetify_components.js", | ||||
|       "fileHash": "42f8a374", | ||||
|       "needsInterop": false | ||||
|     }, | ||||
|     "vuetify/labs/components": { | ||||
|       "src": "../../node_modules/vuetify/lib/labs/components.mjs", | ||||
|       "file": "vuetify_labs_components.js", | ||||
|       "fileHash": "a46a672a", | ||||
|       "needsInterop": false | ||||
|     }, | ||||
|     "vuetify/directives": { | ||||
|       "src": "../../node_modules/vuetify/lib/directives/index.mjs", | ||||
|       "file": "vuetify_directives.js", | ||||
|       "fileHash": "66c34130", | ||||
|       "needsInterop": false | ||||
|     }, | ||||
|     "vue-router": { | ||||
|       "src": "../../node_modules/vue-router/dist/vue-router.mjs", | ||||
|       "file": "vue-router.js", | ||||
|       "fileHash": "56488480", | ||||
|       "needsInterop": false | ||||
|     } | ||||
|   }, | ||||
|   "chunks": { | ||||
|     "chunk-WKTZ3I3B": { | ||||
|       "file": "chunk-WKTZ3I3B.js" | ||||
|     }, | ||||
|     "chunk-XJKCW2PU": { | ||||
|       "file": "chunk-XJKCW2PU.js" | ||||
|     }, | ||||
|     "chunk-VFMM6PD2": { | ||||
|       "file": "chunk-VFMM6PD2.js" | ||||
|     }, | ||||
|     "chunk-XREPMAG4": { | ||||
|       "file": "chunk-XREPMAG4.js" | ||||
|     }, | ||||
|     "chunk-ZUZRGUJJ": { | ||||
|       "file": "chunk-ZUZRGUJJ.js" | ||||
|     }, | ||||
|     "chunk-V6X3YB3T": { | ||||
|       "file": "chunk-V6X3YB3T.js" | ||||
|     }, | ||||
|     "chunk-6CN2GOSH": { | ||||
|       "file": "chunk-6CN2GOSH.js" | ||||
|     }, | ||||
|     "chunk-AYVSL3LM": { | ||||
|       "file": "chunk-AYVSL3LM.js" | ||||
|     }, | ||||
|     "chunk-Q5PGHB6G": { | ||||
|       "file": "chunk-Q5PGHB6G.js" | ||||
|     } | ||||
|   } | ||||
| } | ||||
| @@ -14,12 +14,12 @@ | ||||
|   "dependencies": { | ||||
|     "@fontsource/roboto": "^5.0.13", | ||||
|     "@mdi/font": "^7.4.47", | ||||
|     "@unocss/reset": "^0.58.9", | ||||
|     "@unocss/reset": "^0.61.0", | ||||
|     "dompurify": "^3.1.5", | ||||
|     "marked": "^12.0.2", | ||||
|     "pinia": "^2.1.7", | ||||
|     "universal-cookie": "^7.1.4", | ||||
|     "unocss": "^0.58.9", | ||||
|     "unocss": "^0.61.0", | ||||
|     "vue": "^3.4.30", | ||||
|     "vue-router": "^4.4.0", | ||||
|     "vuetify": "^3.6.10" | ||||
|   | ||||
| @@ -10,7 +10,7 @@ | ||||
|                    subtitle="There is no more new things for you..." /> | ||||
|     </v-list> | ||||
|  | ||||
|     <v-list v-else class="w-[380px]" density="compact" lines="three"> | ||||
|     <v-list v-else density="compact" lines="three"> | ||||
|       <v-list-item v-for="(item, idx) in notify.notifications" :key="idx"> | ||||
|         <template #title>{{ item.subject }}</template> | ||||
|         <template #subtitle>{{ item.content }}</template> | ||||
|   | ||||
| @@ -1,15 +1,15 @@ | ||||
| <template> | ||||
|   <div> | ||||
|     <v-card> | ||||
|       <v-img cover class="bg-grey-lighten-2" :height="240" :src="'/api/avatar/' + id.userinfo.data.banner" /> | ||||
|       <v-img cover class="bg-grey-lighten-2" :height="240" src="/api/avatar" /> | ||||
|  | ||||
|       <v-card-text class="flex gap-3.5 px-5 pb-5"> | ||||
|         <v-avatar | ||||
|           color="grey-lighten-2" | ||||
|           icon="mdi-account-circle" | ||||
|           class="rounded-card" | ||||
|           image="/api/banner" | ||||
|           :size="54" | ||||
|           :image="'/api/avatar/' + id.userinfo.data.avatar" | ||||
|         /> | ||||
|         <div> | ||||
|           <h1 class="text-2xl cursor-pointer" @click="show.realname = !show.realname">{{ displayName }}</h1> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user