Thymeleafã§éã¶
Javaç¨ã®ãã³ãã¬ã¼ãã¨ã³ã¸ã³ã§ããThymeleafã§éãã§ã¿ã
åºæ¬
ã¾ãå®è£ ããã
次ã«ãã³ãã¬ã¼ãã
Templateãèªã¿è¾¼ãããã®resolverãTemplateEngineã«é£ããã¾ãããã³ãã¬ã¼ãå ã®å¤æ°ãªã©ã¯Contextã«ã»ãããã¦engineã«ä¸ãã¦ãããåºæ¬ã¯ãããªæãã§ãã
TemplateResolver
ä¸çªãã¢ã§ãããã³ãã¬ã¼ããã¡ã¤ã«ã解決ããTemplateResolverã§ãããããã®å®è£ ã¯4種é¡ããã¾ãã
- FileTemplateResolver
- ClassLoaderTemplateResolver
- UrlTemplateResolver
- ServletContextTemplateResolver
å ¨ã¦ã®resolverã¯ITemplateResolverã¤ã³ã¿ã¼ãã§ã¤ã¹ãå®è£ ãã¦ãããTemplateResolverã¨ãã親ã¯ã©ã¹ãç¶æ¿ãã¦ã¾ãããããä½ãéããã¨ããã¨ããã³ãã¬ã¼ããã¡ã¤ã«ãèªã¿è¾¼ãæ段ã®éããããã¾ãã
ä¾ãã°FileTemplateResolverã¯ã³ã³ã¹ãã©ã¯ã¿ã§FileResourceResolverã¨ãããªã½ã¼ã¹åå¾ã®çºã®ã¯ã©ã¹ãã»ãããã¾ããããã®ä¸ã§ã¯Fileã¯ã©ã¹ãç¨ãã¦æå®ããããã³ãã¬ã¼ãããªã½ã¼ã¹ãã¡ã¤ã«ã¨ãã¦åå¾ãããã¨ãã¾ãã
対ãã¦ClassLoaderTemplateResolverã¯ClassLoaderResourceResolverå ã§ã¯ã©ã¹ãã¼ããå©ç¨ãã¦ãªã½ã¼ã¹ãã¡ã¤ã«ãåå¾ãã¾ã
ããã®éããä¸çªãããæãã®ã¯ããã¹ãæå®ããæã«åºã¾ãã
ââsrc ââorg â ââmisty â âârc â ââthymeleafsample ââtemplate ââindex.html
ãããªæãã§ãã³ãã¬ã¼ããç½®ããã¨ãã¾ãã
ä¸è¨ãµã³ãã«ã¯ClassLoaderTemplateResolverï¼é·ããª...ï¼ã使ã£ãä¾ã§ããããã®å ´åãClassLoaderã¯srcãã£ã¬ã¯ããªãã«ã¼ããã£ã¬ã¯ããªã¨ããç¸å¯¾ãã¹ã§æå®ã§ãã¾ãã
FileTemplateResolverã使ãå ´åã¯ãããªãã¾ãã
ã¾ããã¡ãã£ã¨èããã°åãããã§ããã©ãä¾ãã°èªä½ã©ã¤ãã©ãªã§JARãã¡ã¤ã«ã«åºããæã¨ãã©ããªãããã¨ãèããã¨ãã©ã®Resolverã使ãã¹ããããããèãã¾ããã
ç¶ãã¯æ°ãåãããæ¸ãã¾ã
Viewã®æ¡å¼µã«ããç¬èªå±æ§ã¨åãè¾¼ã¿ãã©ã³ã
TextViewãªãããæ¡å¼µãã¦ãã¤ãã§ã«ç«¯æ«çµã¿è¾¼ã¿ãã©ã³ã以å¤ã®ãã©ã³ãã使ã£ã¡ãããçãªè©±ã§ãããããã¦ä»¥ä¸ã®è³æãè¦ãã¨å¤å大ä¸å¤«ã§ã
http://developer.android.com/intl/ja/training/custom-views/create-view.html
æ¢åViewãæ¡å¼µããã«ã¹ã¿ã ãã¥ã¼ãXMLãã¼ã¹ã§æ§ç¯ããå ´åããã®ã³ã³ãã¼ãã³ãã®å±æ§ãäºãresourcesã§è¨å®ãã¦ããå¿ è¦ãããã¾ãã
ä¸è¨ã®ããã«ãå©ç¨ããã«ã¹ã¿ã ãã¥ã¼ã«å¯¾ãã¦è¨å®å¯è½ãªå±æ§åã¨å±æ§ãã©ã¼ããããå®ç¾©ãã¾ãã
次ã«Layoutãã¡ã¤ã«ä¸ã§ãã«ã¹ã¿ã ãã¥ã¼ãè¨å®ãã¾ããããã§å¿ è¦ãªã®ã¯ç¬èªã«è¨å®ããå±æ§ã¯åå空éãå¥éæè¨ãã¦ããå¿ è¦ãããã¨ãããã¨ã§ãã
xmlns:app="http://schemas.android.com/apk/res/org.misty.rc.testproject"
ä¸è¨ã®ããã«appï¼NamespaceNameã¯ãªãã§ãããã§ãï¼ã¨å®ç¾©ãããã¨ã§ããã®å±æ§å¤ã«
app:text
ã¨ããå½¢ã§ã¢ã¯ã»ã¹ã§ããããã«ãªãã¾ããæå¾ã¯ã«ã¹ã¿ã ãã¥ã¼ã®å®è£ ã§ãã
ã³ã³ã¹ãã©ã¯ã¿ã§æ¸¡ãããAttributeSetããç¬èªã®å±æ§å¤ãå¼ã£å¼µã£ã¦ãããã®ãTypedArrayã«æ ¼ç´ãã¾ããé åå ã®å¤ã¯
R.styleable.TestView_color
ã®ããã«INDEXåç §å¯è½ãªã®ã§ãå¼ããå¤ãsetãã¾ãããµã³ãã«ã¯åç´ã«ç¬èªå±æ§ã®å¤ãæ¢åãã¥ã¼ã®å±æ§ã«ã»ãããã¦ãã ãã§ãããã³ã³ã¹ãã©ã¯ã¿å ã§ç¬èªå±æ§å¤ãåç §ãã¦ããã°ãoverrideããé¢æ°å ã§ããããªå¦çãå¯è½ã«ãªãã¾ãã
æå¾ã«assetManagerãå©ç¨ãã¦ãassetsãã£ã¬ã¯ããªå ã«ä¿åãããã©ã³ããå©ç¨ãã¦ãã¥ã¼ã§è¡¨ç¤ºããããã©ã³ããå¤æ´ãã¾ããcreateFromAssetãå©ç¨ãã¦æ°ããTypefaceãä½æãããããsetããã°å¤æ´å¯è½ã§ãã
Android4.2ã®ããã¯ç»é¢Widgetã¨èªåæ´æ°ç³»ã®è©±
Androidã®Widgetã®è©±
ç§ãNexus7æã£ã¦ããã§ããï¼ãã¤ã¡ï¼ãæè¿JB4.2ã«æ´æ°ãã¾ãããæ°ããæ©è½ã¨ãã¦ã¾ããããããããã§ããããã®å ã®ä¸ã¤ã«ãLockScreen Widgetãã£ã¦ã®ãããã¾ããè¦ããã«ããã¯ç»é¢ä¸ã«Widgetã表示ãããã¤ã§ãã
ã§ãããããªãã¨ããããããµããã§ãããsleepãã復帰ããæã«ä¸¡ãµã¤ãã«Widgetã®ãã¬ã¼ã ãä¸ç¬è¡¨ç¤ºãããããããããæè¨Widgetã®ãã©ã³ããæ ¼å¥½æªãããã¸ã§ããã§ãããï¼ã£ã¦æããªãã§ãããã
ã§ããããå«ã§ã¨ããããä»ã¾ã§é¿ãã¦ããâ¦ããæãã¤ãã¦ããªãã£ãWidgetã«æãåºãã¦ã¿ãããã¨ããããã話ã§ãã
AppWidgetã®åºæ¬å½¢
ä»åã¯ã¨ããããã試ãã§ãæå»ãTextViewã«è¡¨ç¤ºãããã ãã®Widgetãä½ã£ã¦ã¿ã¾ãããã®ã¸ãã®è©±ã¯ããããã°ã°ãã°åºã¦ãããã§ãããä¸çªç°¡åãªã®ã¯AppWidgetProviderãç¶æ¿ããã¯ã©ã¹ã§å®çµããã¡ããã®ãä¸çªç°¡åãªãã§ãããã
ã¨ããããã½ã¼ã¹ã¯ä»¥ä¸ãåç §ãã¦ãã ããã
https://github.com/misty-rc/RonnClockRepeat
ãã¤ã³ã
åæè¨å®
ã¾ãAndroidManifest.xmlã«receiverã®è¨å®ãå¿ è¦ã«ãªãã¾ã
ããã«intent-filterã¨ãã¦android.appwidget.action.APPWIDGET_UPDATEãè¨å®ãã¦ãããã¨ã§ãreceiverã¯Widgetæ´æ°ãintentããèªèãããã¨ãã§ãã¾ããmeta-dataã¿ã°ã«ã¯åºæ¬è¨å®ãè¨è¿°ããxmlããã¦ãã¾ãã
ããã§éè¦ãªã®ããæ°ããå°å ¥ãããLockScreenã§Widgetã使ãããã«ã¯android:widgetCategoryå±æ§ã«"keyguard"ã¨ããå¤ãè¨å®ããå¿ è¦ãããã¾ããkeyguardã¨ã¯è¦ããã«ããã¯ç»é¢ã®ãã¨ã§ãããã¾ãkeyguardãæå®ããå ´åããã¼ã ç»é¢ç¨ã®ã¬ã¤ã¢ã¦ãã¨ã¯å¥ã«keyguardç¨ã®ã¬ã¤ã¢ã¦ãæå®ãå¿ è¦ã«ãªãã¾ãããããandroid:initialKeyguardLayoutå±æ§ã§ãã
ã¶ã£ã¡ããã¦è¨ã£ã¦ãã¾ãã¨ãæ®éã®Widgetãä½ã£ã¦appwidget-providerã«ä¸è¨å±æ§ãå ãã¦ããã°ããã¯ç»é¢ä¸ã§ä½¿ããããã«ãªãâ¦ã¯ãã§ãã
ã³ã¼ãçãª
Widgetãä½ãå ´åã«å©ç¨ããAppWidgetProviderãç¶æ¿ããã¯ã©ã¹ã§onUpdateãoverrideããã¾ãããã§å¿ è¦ãªãã¨ãæ¸ã¾ãã¦ãã¾ãã¾ãã
ã¾ãintentãä½æããããã«æ´æ°ç¨ã®ãªã¬ãªã¬ã¢ã¯ã·ã§ã³ãã»ãããã¾ãã次ã«getBroadcastã§PendingIntentãç¨æãããããAlarmManagerã«ç»é²ãããã¾ããgetBroadcastã§è¿ãããPendingIntentãAlarmManagerã«ãã£ã¦ä¸å®æéãã¨ã«broadcastãããããonReceiveã§åããã¨ããæãã«ãªãã¾ãã
ä»åã¯AlarmManager.setRepeatingã使ã£ã¦ã¾ããããã¯intervalã®æéæ¯ã«å¦çãç¹°ãè¿ãé¢æ°ã§ãããAlarmManager.setã使ããä¸å®Intervalãèªåã§ç¨æããæ¹æ³ãããã¾ããã°ã°ã£ã¦ããè¦ãããã®ã¯ãã®æ¹æ³ã§ããã
ãã®å ´åãã¾ãonUpdateã§åæ表示ãè¡ã£ãå¾ã§ãä¸å®æéå¾ã«broadcastããããã«AlarmManagerã«setãã¾ããAlarmManager.setã¯1åãã£ãããªã®ã§ãonReceiveããã¿ã¤ãã³ã°ã§å度setãã¦ããå¿ è¦ãããã¾ãããµã³ãã«ã¯é©å½ã«æ¢ãã¦ãã ããï¼ã
Emacs+Ensimeç°å¢ã使ã£ã¦Play Framework2.0ã§éã¶
ã¨ããããâ¦
EmacsãVimãå¹¾ã使ãæ £ãã¦ããããã£ã¦è¨ã£ã¦ããã¢ãã«ãã£ã¦ã¯Eclipse使ã£ããIntelliJ使ã£ããããã»ããå½ç¶ä¾¿å©ãªå ´åãããããã§ãç¹ã«Javaã«é¢ãã¦ã¯Emacs+JDEEã¯æ¢ã«ãªã¯ã³ã³ãªã®ã§ãããããEmacsã§æ¸ãã®ã馬鹿ãããæããããããã§ãããããã§ãEmacsãVimã使ãã®ã¯åãªããªããã¼ã§ãããã¨ãèªèãã¦ãã人ã ããããã®é«ã¿ãæãã訳ã§ãï¼ã¯ãï¼
åã£ã¦ãã
Ensimeã¯githubã§å ¬éããã¦ãã¾ããããã§æããcloneã¨ãããããªã£ã¡ããã¾ãããEnsimeã¯å©ç¨ããScalaã®ãã¼ã¸ã§ã³ã«å¼·ãä¾åãã¦ããããã§ãéçºã®å 端ãåã£ã¦ããããã¡ããã¨Downloadç¨ã¨ãã¦ç¨æãã¦ãããã®ã使ã£ãã»ãããçµé¨ä¸ãå®å®ãã¦ãã¦ããããã§ãã
https://github.com/aemoncannon/ensime/downloads
ç¾æç¹ã§ã¯Scalaã®ææ°å®å®çã2.9.2ãªã®ã§ã2.9.2ç¨ã§æçªãææ°ã®ãã¤ãæã£ã¦ããã°åé¡ãªãã¨æãã¾ã
ããã§ã¯ensime_2.9.2-0.9.8.1.tar.gzã使ãã¾ã
scala-mode
ãã£ã¨ãã®åã«ãEnsimeã¯Scalaã«ä»å±ãã¦ããscala-modeã«ä¾åãã¾ãã®ã§ãäºãscala-modeãå ¥ã£ã¦ãããã¨ãåæã«ãªãã¾ããã¾ããå½ç¶å ¥ã£ã¦ããã¨ã¯æãããã£ã¼
ãï¼ç¡ãï¼å®ã¯stableçã®2.9.2ã®ããã±ã¼ã¸ã«ã¯å ¥ã£ã¦ãã¾ããï¼èª¬æã¯ããã«ããã¾ãã
Subsequently, we moved our repository to GitHub and changed our distribution packaging infrastructure. At this time, "tool-support" it is not by default part of the 2.9.2 distribution, but it will be made available again in the next releases. In the meantime, you can find the source repository at this address: http://www.scala-lang.org/node/91#tool_support
ã¨ãããã¨ãªã®ã§ãããããåã£ã¦ãã¦å ¥ãã¾ãã
ãããªæãã«æ¸ãã¦ããã°åãã§ããã
ããã¦ã¿ã
åã£ã¦ããensimeãé©å½ãªå ´æã«å±éããè¨å®ã§load-pathãéãã¦ããã°ã¨ããããOKã§ãã
Play! Frameworkã§éã¶çºã«
å½ç¶ã§ããPlayFrameworkãæ¢ã«Installããã¦ããã¨ãã¾ããã¾ããPlayèªä½ã¯å±éãã¦PATHéãã°ããã ããªã®ã§ãç¹ã«åé¡ãªããã¨æãã¾ããã¨ããããæ°ããããã¸ã§ã¯ããä½æãã¾ãã
$ play new testapp _ _ _ __ | | __ _ _ _| | | '_ \| |/ _' | || |_| | __/|_|\____|\__ (_) |_| |__/ play! 2.0.4, http://www.playframework.org The new application will be created in /home/misty/dev/scala/testapp What is the application name? > testapp Which template do you want to use for this new application? 1 - Create a simple Scala application 2 - Create a simple Java application 3 - Create an empty project > 1 OK, application testapp is created. Have fun! $
ã¯ããã§ãã¾ãããç¾å¨ãdefaultã®Skeletonã§ããã¸ã§ã¯ããä½æããã¨ãããªæãã§ãã次ã«ensimeã§ä½¿ãããã«Playèªä½ã解æãã¦ensimeä¸ããè£å®åºæ¥ãããã«ãã¾ãããã®çºã«ãä½æããããã¸ã§ã¯ããã£ã¬ã¯ããªå ã®project/plugins.sbtã«pluginã®è¨å®ãã¾ãã
$ cat plugins.sbt // Comment to get more information during initialization logLevel := Level.Warn // The Typesafe repository resolvers += "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/" // Use the Play sbt plugin for Play projects addSbtPlugin("play" % "sbt-plugin" % "2.0.4") addSbtPlugin("org.ensime" % "ensime-sbt-cmd" % "0.1.0") // <-ãã
ããã¾ã§ãããplay consoleãèµ·åãã¦ensime generateãå®è¡ãã¾ãã
[testapp] $ ensime generate [info] Gathering project information... [info] Processing project: ProjectRef(file:/home/misty/Develop/scala/testapp/,testapp)... [info] Reading setting: name... ï¼ç¥ï¼ [info] Reading setting: class-directory... [info] Reading setting: ensime-config... [info] Wrote configuration to .ensime [testapp] $
ããã§ensimeã®å©ç¨æºåå®äºã§ãã
Emacs + Ensime
ã¨ããããå ã»ã©ä½ã£ãããã¸ã§ã¯ãã§ä½æãããã½ã¼ã¹ãéããã¨ããã¨
error Not connected. M-x ensime to connect
ã¿ãããªãã¨ãè¨ãããã®ã§
M-x ensime
ãèµ·åãã¾ããç¹ã«åé¡ããªããã°ãã¾ããã¨èµ·åãã¦ä½¿ããããã«ãªãã¯ãã§ãï¼ç¶ãã¯æ°ãåãããæ¸ãã¾ãã
mongoose-authã§OAuthèªè¨¼
ä»åã¯everyauthã¨ããèªè¨¼ãã¸ãã¯ã®ã©ããã¼ã©ã¤ãã©ãªã§ã¯ãªãããµã¼ãã¹æ¯ã«çºãã¦å¯¾å¿ããèªè¨¼ã©ã¤ãã©ãªãæ´ã«mongooseã®ãã©ã°ã¤ã³ã¨ãã¦ä½¿ããmongoose-authã使ã£ã¦èªè¨¼ããã¾ãï¼ãããããï¼
ããããã«å人çãªã¡ã¢ã§ã
ç¨æãããã®
- node.js
- mongoose
- mongoose-auth
ãã®åã«
ãã®mongoose-authã¯å½¢å¼ã¨ãã¦ã¯everyauthãmongooseãã使ãããã®pluginã¨ããå½¢å¼ã§ãããããã§ããã°åãã£ã¦everyauthã®ç¥èã¯ããç¨åº¦æ¬²ããã¨ããã§ãã
å®éã®ã¨ãããREADMEã«ãããµã³ãã«ãåãããã°å¤§ä½ã§ãã¾ãï¼ããï¼ããã READMEã«ç¡ãé¨åã§ãããã«ããé¨åãããã®ã§ãã®ã¸ãããµã³ãã«ã§æ¸ãã¦ã¿ã¾ã
Schemaã®æ¡å¼µ
mongoose-authã使ãã¨githubãªãgithubã¢ã¸ã¥ã¼ã«ãfacebookãªãfacebookã¢ã¸ã¥ã¼ã«ã使ãã®ã§ãäºãç¨æãããUserSchemaããã¼ã¹ã«DBã«æ ¼ç´ããã¾ã
mongoose-auth:lib/modules/github/schema.js
module.exports = { github: { id: Number , login: String , gravatarId: String , name: String , email: String , publicRepoCount: Number , publicGistCount: Number , followingCount: Number , followersCount: Number , company: String , blog: String , location: String , permission: String , createdAt: Date // Private data , totalPrivateRepoCount: Number , collaborators: Number , diskUsage: Number , ownedPrivateRepoCount: Number , privateGistCount: Number , plan: { name: String , collaborators: Number , space: Number , privateRepos: Number } } , 'github.type': String };
ãã®ã¾ã¾ã§ãã¾ãæä½éå¿ è¦ãªæ å ±ã¯ç¢ºä¿ããã¦ãããã§ãããããã«è¿½å ã§å±æ§è¿½å ããããªãããªãã¦æãã¾ãããã
var mongoose = require('mongoose'), mongooseAuth = require('mongoose-auth'), Schema = mongoose.Schema, ObjectId = mongoose.Schema.ObjectId; // å ±éé ç®ã¨ãã¦displayNameã¨ããå±æ§ã追å ãã var UserSchema = new Schema({ displayName: {type:String, default: null} });
ãããã¦ããã¨åã¢ã¸ã¥ã¼ã«ã®Schemaã§è¿½å ããé ç®ãmongooseçµç±ã§æ´æ°ã§ããããã«ãªãã¾ãã
findOrCreateUserã®è¨å®
ä¾ãã°ãæ®éã«å©ç¨ããå ´åã¯ä»¥ä¸ã®ãããªã½ã¼ã¹ã§åãã¾ã
var mongoose = require('mongoose') , Schema = mongoose.Schema , mongooseAuth = require('mongoose-auth'); var UserSchema = new Schema({}) , User; // STEP 1: Schema Decoration and Configuration for the Routing UserSchema.plugin(mongooseAuth, { // Here, we attach your User model to every module everymodule: { everyauth: { User: function () { return User; } } } , github: { everyauth: { myHostname: 'http://localhost:3000' , appId: 'YOUR APP ID HERE' , appSecret: 'YOUR APP SECRET HERE' , redirectPath: '/' } } }); ...
ããã¯READMEããã®æç²ã§ãããUserSchemaã«å¯¾ããpluginã¨ãã¦githubã®è¨å®é ç®ãè¨è¿°ããã ãã§ããããã¯å®éã«ã¯everyauthã®githubã¢ã¸ã¥ã¼ã«ã«å¯¾ããè¨å®ã«ç´çµãã¦ãã ãã§ããeveryauthã§ã¯findOrCreateUseré¢æ°ãå®è£ ãã¦ãã訳ã§ã¯ããã¾ããããeveryauthã®OAuth2ã®å®è£ é¨åã§findOrCreateUserãèªè¨¼ã·ã¼ã±ã³ã¹ã®stepã¨ãã¦å¼ã³åºãã¦ãã¾ãã
everyauth:lib/modules/oauth2.js
.get('callbackPath', 'the callback path that the 3rd party OAuth provider redirects to after an OAuth authorization result - e.g., "/auth/facebook/callback"') .step('getCode') .description('retrieves a verifier code from the url query') .accepts('req res') .promises('code') .canBreakTo('authCallbackErrorSteps') .step('getAccessToken') .accepts('code') .promises('accessToken extra') .step('fetchOAuthUser') .accepts('accessToken') .promises('oauthUser') .step('getSession') .accepts('req') .promises('session') .step('findOrCreateUser') //<- ã³ã³ //.optional() .accepts('session accessToken extra oauthUser') .promises('user') .step('compile') .accepts('accessToken extra oauthUser user') .promises('auth') .step('addToSession') .accepts('session auth') .promises(null) .step('sendResponse') .accepts('res') .promises(null)
ãããå©ç¨ãã¦findOrCreateUseré¢æ°ãå®ç¾©ã¨ãã¦å®è£ ãã¦ããã¨èªè¨¼å®äºæã«èªåçã«findOrCreateUserãå®è¡ã§ãã¾ããæè¬hookçãªç©ã§ããmongoose-authã§ã¯defaultã®å®ç¾©ã¨ãã¦äºãfindOrCreateUseré¢æ°ãå®ç¾©ããã¦ãã¾ãã
mongoose-auth:lib/modules/github/everyauth.js
// Defaults module.exports = { findOrCreateUser: function (sess, accessTok, accessTokExtra, ghUser) { var promise = this.Promise() , self = this; // TODO Check user in session or request helper first // e.g., req.user or sess.auth.userId this.User()().findOne({'github.id': ghUser.id}, function (err, foundUser) { if (foundUser) return promise.fulfill(foundUser); self.User()().createWithGithub(ghUser, accessTok, function (err, createdUser) { return promise.fulfill(createdUser); }); }); return promise; } };
ãããã£ã¦ãã®æåãå¤ãããå ´åã¯ããã¤ãoverrideããå®ç¾©ã追å ãã¦ããã°è¯ã訳ã§ãã
UserSchema.plugin(mongooseAuth, { everymodule: { everyauth: { User: function() { return User; }, handleLogout: function(req, res) { req.logout(); res.writeHead(303, {'Location': this.logoutRedirectPath()}); res.end(); } } }, github: { everyauth: { myHostname: conf.myHostname, appId: conf.github.oauth.appId, appSecret: conf.github.oauth.appSecret, scope: 'user,public_repo,repo,gist', redirectPath: '/', // ã³ã³ãã findOrCreateUser: function(session, accessTok, accessTokExtra, ghUser) { var promise = this.Promise(), User = this.User()(); // mongodbãã該å½ããidã®æ å ±ãæ¤ç´¢ User.findOne({'github.id': ghUser.id}, function(err, foundUser) { if(err) return promise.fail(err); if(foundUser) return promise.fulfill(foundUser); // ç¡ãå ´åã¯UserSchemaãå ã«ä½æ console.log('CREATE GITHUB USER'); User.createWithGithub(ghUser, accessTok, function(err, createUser) { if(err) return promise.fail(err); // Schemaã§å®ç¾©ãã追å å±æ§ã«å¤ãã»ãã createUser.displayName = ghUser.name; // ä¿å createUser.save(function(err, modUser) { if(err) return promise.fail(err); return promise.fulfill(modUser); }); }); }); return promise; } } } });
使ãéã¨ãã¦ã¯ãä¾ãã°èªè¨¼å¾ã®accessTokenãsessionã«å ¥ãã¦ããã¨ãï¼ãããæªããã¯å¥ã«ãã¦â¦ï¼ãå¥ã®schemaãæ´æ°ãããã¾ããããã使ãéã¯ããããããã¾ããã