- add(graphql-yoga, nodemon, babel-cli)
- github and .gitignore
- yarn init
- package.json(scripts)
- nodemon.json(ext-js graphql)
- add(dotenv, @babel/node, @babel/core, @babel/preset-env)
- config(.env, .babelrc)
- server.js
- typeDefs, resolver, dotenv_config, GraphQLServer, port
- add(morgan, graphql-tools, merge-graphql-schemas)
- morgan(use express middleware)
- set schema.js with types, resolvers(use makeExecutableSchema, filelLoader, mergeResolvers, mergeTypes)
- make api folder with type, resolver
- Prisma(create service, init, deploy)
- Define types
- gitIgnore(generated, prisma.yml)
- Test CRUD at endpoint
- use prisma script(deploy, generate)
- frontend - GraphQL API Server(prisma) - Database
- add(prisma-client-lib)
- copy types to models.graphql without @
- make some User resolvers
- $fragment
- Create account
- Request Secret
- confirm Secret (Login)
- Like / Unlike a photo
- Comment on a photo
- Search by user
- Search by location
- Follow user
- Unfollow user
- Edit my profile
- See user profile
- See my profile
- See the full photo
- Upload a photo
- Edit the photo(Delete)
- See the feed
- Send private message
- See rooms
- See room
- Receive message
- Create Account
- Query root type must be provided.
- Request Secret
- Make random words (https://www.randomlists.com/)
- generate secret (utils.js)
- add(nodemailer, nodemailer-sendgrid-transport)
- use dotenv with path
- nodemailer(https://nodemailer.com/)
- sendgrid(https://sendgrid.com/)
- Confirm Secret
- add(passport, passport-jwt, jsonwebtoken)
- use passport-jwt http://www.passportjs.org/
- create passport.js
- randomKey https://randomkeygen.com/
- fix dotenv(env.js)
- middleware(passport.authenticate)
- use context for resolvers
- toggleLike resolver
- use prisma.$exist return true or false
- make middlewares.js (isAuthenticated)
- addComment resolver
- searchUser, searchPost
- use contains, starts_with
- prisma.updateUser, data
- after confirm Secret remove login Secret
- isAuthenticated is move to context in server.js
- editUser, seeUser
- (underscore_(variable)), doubleunderscore__(arguments)
- type change UserProfile (seeUser, me)
- FullPost: post, comments, likeCount
- parent is give to higher resolver`s userinfo
- fullName resolver can use everywhere beacuse schema.js is merging all resolvers
- fullName resolver is move to computed.js
- amIFollowing, itsMe add to computed.js
- Debug some errors which is follower_some following_some
- change name of resolvers (amIFollowing, itsMe => isFollowing, isSelf)
- Post_isLiked resolve add to computed.js
- upload (caption, files)
- files, user add to seeFullPost.js
- createdAt, updatedAt add to all types
- create computed.js in API_Post folder
- use enum(edit, delete)
- editPost(id, caption, location, action(edit, delete))
- use DELETE @relation(name: "SomeOfSome", onDelete: CASCADE) with relation
- default SET_NULL is better
- createdAt, updatedAt add to datamodel.prisma every types
- prisma deploy if error prisma deploy --force
- seeRooms, private message
- add fragment(ROOM_FRAGMENT)
- sendMessage resolver
- avatar add to model in user type and editUser Resolver
- MESSAGE_FRAGMENT
- ROOM_FRAGMENT add to seeRooms
- easy subscription in prisma
- resolve return payload
- need node()
- delete fragment.js